質問

私は右のstdに削除/要素を追加する::マップが他の要素(すなわち、それらがメモリに再配置させることが)影響しないことを、次のが安全であるようにと仮定してアム

私は、コンテナ上の情報を様々なサイトを見てだけで、イテレータが無効にされている例を知った私はすでに知っている...

std::map<std::string,std::string> map;
PopulateMap(map);
std::string &a= map["x"];
AddMoreData(map);
RemoveRandomKeysExceptX(map);
map["x"] = "foo";
std::cout << a << " " << map["x"] << std::endl;//prints "foo foo"
a = "bar";
std::cout << a << " " << map["x"] << std::endl;//prints "bar bar"

私はちょうど幸運取得していないか、それがコンパイラ間で変化しないことを意味するものではありませんが動作しているようですVC9、上のいくつかの類似したコードをテストします。

役に立ちましたか?

解決

標準が連想コンテナについて23.1.2/8にこの上明らかである。

  

インサート部材は、容器へのイテレータと参照の有効性に影響を与えないものとし、消去メンバーが消去要素にのみイテレータと参照を無効にしなければならない。

他のヒント

  

地図はマップに新しい要素を挿入すると、既存の要素を指すイテレータを無効にしないことが重要な特性を持っています。    SGIドキュメントのから取った見積もります。

イテレータが変化しないことが保証されている場合は、

、その後、彼らはまた、指し示す値を変更することはできません。

これに類似していた答えを持っていた以前のNaveen。あなたは何をしているか、私のロジックに誤りがある場合を除き、安全です。

編集2: オペレータから値を取得する方法を確認するために SGIドキュメントの中でポイント3を参照してください。 []イテレータから値を取得することと同じである。

はい、あなたがこの上でカウントすることができます。

// retrieve reference to string stored at "x"
// note that since [] returns a reference, it must insert an element at "x" if 
// it doesn't exists (in this case an empty string)
std::string &a= map["x"];

// retrieve reference for "x" again and set value to "foo"
map["x"] = "foo";

// use already stored reference
a = "bar";
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top