7

std::map への要素の追加/削除は他の要素に影響を与えず (つまり、それらがメモリ内で再配置される)、以下が安全であると仮定するのは正しいですか:

コンテナーに関する情報を含むさまざまなサイトを調べましたが、既に知っているイテレーターが無効化されているケースについてしか知りませんでした...

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 で同様のコードをテストしましたが、これは機能しているように見えますが、運が良かっただけでなく、コンパイラ間で変化しないという意味でもありません。

4

3 に答える 3

9

標準は、23.1.2/8連想コンテナについてこれについて明確です

挿入メンバーは反復子とコンテナーへの参照の有効性に影響を与えず、消去メンバーは反復子と消去された要素への参照のみを無効にします。

于 2009-07-01T13:40:18.357 に答える
4

Map には、新しい要素をマップに挿入しても、既存の要素を指す反復子が無効にならないという重要な特性があります。sgi docsからの引用。

イテレータが変更されないことが保証されている場合、イテレータが指す値も変更できません。

naveen は以前、これに似た回答をしていました。私の論理に誤りがない限り、あなたがしていることは安全です。

編集 2: sgi docsのポイント 3を参照して、演算子 [] から値を取得することが反復子から値を取得することと同じであることを確認してください。

于 2009-07-01T11:45:28.367 に答える
0

はい、これを当てにすることができます。

// 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";
于 2009-07-01T12:23:20.787 に答える