2016-10-05 18 views
6

I次のコードを持っている:のstd :: unordered_mapポインタ/参照の無効

std::unordered_map<std::string, std::string> map; 

map["k1"] = "v1"; 
auto& v1 = map["k1"]; 
map["k2"] = "v2"; 

http://en.cppreference.com/w/cpp/container/unordered_map

注意事項を読んだ後は、

スワップ機能は、内部イテレータのいずれかを無効にしないでくださいスワップ領域の終わりを示すイテレータを無効にします。

コンテナに格納されているキーまたはデータへの参照とポインタは、対応するイテレータが無効化されている場合でも、その要素を消去することによってのみ無効になります。

v1が安全に新しい値を挿入した後に使用することができますようにそれは再ハッシュは、挿入時に発生する可能性がある場合でも、見えます。

私のこの見積もりの​​解釈は正しいですか?マップを変更した後、マップから値の参照/ポインタを使用しても構いません(明らかに値自体を消去すると参照/ポインタが無効になります)。

+2

はい、正しいです。 [ここ](http://en.cppreference.com/w/cpp/container/unordered_map/operator_at)も参照してください。 –

答えて

8

v1は、挿入中に再ハッシュが発生する可能性がある場合でも、新しい値を挿入してから安全に使用できます。

はい、std::unordered_map::operator[]は、参照を無効にしません。再ハッシュが行われる場合もあります。

(強調鉱山)

挿入が発生し、容器の再ハッシュをもたらす場合、すべてのイテレータは無効です。さもなければイテレータは影響を受けません。 参照は無効にされていません。標準、$23.2.6/9 Unordered associative containers [unord.req]から

(強調鉱山)焼き直しがイテレータを無効に

、要素、および要素をバケットの変化の間の注文変更はで表示されますが、ポインタを無効になりませんか要素への参照。

関連する問題