• ベストアンサー

STLのmapのキーの変更方法

// この時点でキーは"1,2,3,4,5"と並んでいる std::map< CString , int >::iterator it = m_mapNOKATA.find("3"); if( it != m_mapNOKATA ) { (*it).first = "9"; } というような使い方は出来るのでしょうか? また、これをした場合、 for( it = m_mapNOKATA.begin() ; it != m_mapNOKATA.end() ; ++it) { cout << (*it).first << endl; } とすると、結果は 1 2 4 5 9 となるのか、 1 2 9 4 5 となるのでしょうか? 上の結果が正しいように思えますが、だとしたら、キーを変更した時点で並べ替えが起きている? それとも、キーはinsert後はもう変更できなくて、erase→insertとしなくてはならないのでしょうか? 手元にSTL環境が無いので、確認できません。 どなたかお分かりの方がいらっしゃいましたら教えてください。 たぶん、multimapやsetでも結果は同じかと思います。

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

  • ベストアンサー
  • furyfox
  • ベストアンサー率56% (58/103)
回答No.1

>(*it).first = "9"; それは無理です。 std::mapはinsertの段階で昇順になるよう適切な位置に挿入されます。 >erase→insertとしなくてはならないのでしょうか? つまりそういう事です。 ところで試しにやってみました。 (*it).first = "9"; firstがconstオブジェクトなのでコンパイルエラーになりました。

racoon_asia
質問者

お礼

ありがとうございました。 求めていた答えを得ることが出来ました。 const扱いならば納得が行きます。

その他の回答 (1)

  • amru05
  • ベストアンサー率63% (33/52)
回答No.2

 stlのmapなどはxtreeのBR-Treeを使用して実装されていますので、BR-Treeの動作を調べると疑問が解けると思います。  参考に良いURLがあったので見てみてください。 BR-Tree : 黒 赤 木  左右のバランスを取るtree構造で、検索が早い。データが挿入されるたびにバランスを取るので、その意味では毎回並び変えが発生しているとも言えますね。

参考URL:
http://www.geocities.jp/h2fujimura/mutter/tree/red-black-tree.html
racoon_asia
質問者

お礼

ありがとうございます。 大変勉強になりました。

関連するQ&A

専門家に質問してみよう