C ++のstdの値への参照を格納する::マップ
質問
私は右の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
にこの上明らかである。
インサート部材は、容器へのイテレータと参照の有効性に影響を与えないものとし、消去メンバーが消去要素にのみイテレータと参照を無効にしなければならない。
他のヒント
はい、あなたがこの上でカウントすることができます。
// 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";
所属していません StackOverflow