• ベストアンサー

std::mapの要素を別のキーに移動したいのですがどうしたら良いでし

std::mapの要素を別のキーに移動したいのですがどうしたら良いでしょうか。 例 map<int, list<string>> m; キー|値 1 |"aaa","bbb" 2 |"ccc" ↓ キー|値 2 |"ccc" 3 |"aaa","bbb" 検索して削除して挿入を考えましたがもっと効率の良い方法はあるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

「移動」というのが、どういう意図なのかによりますが(例題の 1 とか 3 とかがどうやって出てきたか) 単純に、1 から 3 に移動させるだけなら。 m[3] = m[1]; m.erase(1); でいけそうな気がします。 (未確認)

110110110110
質問者

お礼

回答ありがとうございます。 これが一番良さそうですね

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

まず余談から: めっちゃ大雑把にいえば std::map<K, V> と std::set<std::pair<const K, V> > は同じ なので, 「find でとってきた iterator の first」は邪悪な手段を使わない限り書き換えられません>#1. なぜかというと #3 で言われているように「std::map はイテレータで昇順スキャンするとキーの昇順に出てくることが保証されている」からです. 邪悪な手段でキーの値を書き換えるとこれが保証できなくなる. ついでにいえば, キーに oprator< () が定義されていなくても適切な比較関数を与えれば OK ですね>#3. もちろん「operator< () が定義されているクラスに対し別途比較関数を与えてキーとする」ことも可能. 本題については, たぶんそれくらいだと思います. splice を使ってもたいして変わらないような気がする.

110110110110
質問者

お礼

回答ありがとうございます。 補足ありがとうございます。

回答No.3

もしかしたらと思って補足。 std::map は、キーの昇順に並ぶことが保証されています。 ですから、 m[9] = ...; m[1] = ...; m[2] = ...; m[5] = ...; という操作の後でも、 m[1] -> m[2] -> m[5] -> m[9] の順に並びます。 (イテレータでたどってみればわかります) そういうわけで、キーの方は、大小関係(最低限、operator<() だったか?)が定義されてないと、実行時に失敗します。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

findで取得したイテレータのfirst(キー)を直接書き換えられませんか? #書き換えた結果マップに不整合が起こっても責任は持てませんが

110110110110
質問者

お礼

回答ありがとうございます

関連するQ&A