2009-07-01 17 views
6

std :: mapに要素を追加/削除しても他の要素に影響を与えない(つまり、メモリに再配置される)ことを前提にして、安全である:C++ 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にいくつかの類似したコードをテストしましたしかし、これはうまくいくように見えますが、それは私が幸運になるだけでなく、コンパイラによって変わらないということを意味しません。

+0

答えを削除した理由は分かりません。ナディーンは、私が見る限り正しいものでした。 – CiscoIPPhone

+0

naveenの答えは反復子に関するもので、この質問は –

+0

ではありません。私は2番目の読書で私は実際の質問が何であるか完全にはっきりしていないので、私の答えも削除しました。 –

答えて

8

標準23.1.2/8

連想コンテナに関する

にインサート部材を容器にイテレータと参照の有効性に影響を与えないものとし、消去メンバーのみイテレータと参照を無効にしなければならない。この上明らかです消去された要素に

+0

+1。標準のコピーを手元に保管する必要があります。私の答えはより簡潔かつ確定的でした。 – CiscoIPPhone

+0

ええ、ok/acroreadのインスタンスを開いたままにして、すばやく検索できるようにするのは良い考えです。この場合、私はここで議論したことを思い出しました:http://stackoverflow.com/questions/516007/stdmap-ポインタへのポインタキー値= this = possible =) –

+0

@ greg-rogersの回答をupvoteすることをお勧めします。受け入れられた答えはあなたがこれを確信できないと言っているが、それは正しいものだから、明らかに。しかし、ポインタが有効であることは、標準がかなり明確です。 –

3

マップには、新しい要素をマップに挿入しても、既存の要素を指すイテレータは無効にならないという重要な特性があります。 sgi docsから取られた の引用。

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

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

編集2: オペレータ[]から値を取得する方法がイテレータから値を取得する方法と同じであることを確認するには、sgi docsのポイント3を参照してください。

+1

私がnaveen(nadeenではない)に指摘したように、 、問題はイテレータに関するものではありません。 –

+0

私はそれを認識しますが、演算子[]はイテレータを使用します。 – CiscoIPPhone

+0

詳細については、SGIのドキュメントに標準ライブラリとの相違があることに注意してください。 –

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"; 
関連する問題