【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード

// この時点でキーは"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でも結果は同じかと思います。

A 回答 (2件)

>(*it).first = "9";


それは無理です。
std::mapはinsertの段階で昇順になるよう適切な位置に挿入されます。

>erase→insertとしなくてはならないのでしょうか?
つまりそういう事です。

ところで試しにやってみました。
(*it).first = "9";
firstがconstオブジェクトなのでコンパイルエラーになりました。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/06/15 10:26

 stlのmapなどはxtreeのBR-Treeを使用して実装されていますので、BR-Treeの動作を調べると疑問が解けると思います。


 参考に良いURLがあったので見てみてください。

BR-Tree : 黒 赤 木
 左右のバランスを取るtree構造で、検索が早い。データが挿入されるたびにバランスを取るので、その意味では毎回並び変えが発生しているとも言えますね。

参考URL:http://www.geocities.jp/h2fujimura/mutter/tree/r …
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/06/15 10:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!