- ベストアンサー
std::mapの要素を別のキーに移動したいのですがどうしたら良いでし
std::mapの要素を別のキーに移動したいのですがどうしたら良いでしょうか。 例 map<int, list<string>> m; キー|値 1 |"aaa","bbb" 2 |"ccc" ↓ キー|値 2 |"ccc" 3 |"aaa","bbb" 検索して削除して挿入を考えましたがもっと効率の良い方法はあるのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「移動」というのが、どういう意図なのかによりますが(例題の 1 とか 3 とかがどうやって出てきたか) 単純に、1 から 3 に移動させるだけなら。 m[3] = m[1]; m.erase(1); でいけそうな気がします。 (未確認)
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
まず余談から: めっちゃ大雑把にいえば std::map<K, V> と std::set<std::pair<const K, V> > は同じ なので, 「find でとってきた iterator の first」は邪悪な手段を使わない限り書き換えられません>#1. なぜかというと #3 で言われているように「std::map はイテレータで昇順スキャンするとキーの昇順に出てくることが保証されている」からです. 邪悪な手段でキーの値を書き換えるとこれが保証できなくなる. ついでにいえば, キーに oprator< () が定義されていなくても適切な比較関数を与えれば OK ですね>#3. もちろん「operator< () が定義されているクラスに対し別途比較関数を与えてキーとする」ことも可能. 本題については, たぶんそれくらいだと思います. splice を使ってもたいして変わらないような気がする.
お礼
回答ありがとうございます。 補足ありがとうございます。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
もしかしたらと思って補足。 std::map は、キーの昇順に並ぶことが保証されています。 ですから、 m[9] = ...; m[1] = ...; m[2] = ...; m[5] = ...; という操作の後でも、 m[1] -> m[2] -> m[5] -> m[9] の順に並びます。 (イテレータでたどってみればわかります) そういうわけで、キーの方は、大小関係(最低限、operator<() だったか?)が定義されてないと、実行時に失敗します。
- D-Matsu
- ベストアンサー率45% (1080/2394)
findで取得したイテレータのfirst(キー)を直接書き換えられませんか? #書き換えた結果マップに不整合が起こっても責任は持てませんが
お礼
回答ありがとうございます
お礼
回答ありがとうございます。 これが一番良さそうですね