2017-06-30 9 views
2

マップの参照解除operator[]constではないことがわかっており、マップを変更できます。しかし、私はオペレータが右側にいるときに何が起こるのだろうと思っていました。例えば:a以来STL std :: mapオペレータ[]割り当ての右側にある場合

std::map<int, int> a; 
int b = a[0]; 

は、これがキー0とマップに新しいエントリを作成します0エントリを持っていないのだろうか? operator[]に関して

+4

はいそうでしょう。それはすべてドキュメントにあります。 –

+7

部分式 'a [0]'は、代入の右辺にあることを知らない。それは、それが左側にあるときと同じことをするか、または他の表現の一部として行う。 –

答えて

6

は、そのようなキーが既に存在しない場合を挿入を行う、キーにキー同等にマッピングされた値への参照を返します。

hereから、強調する鉱山。

これはテストするのも簡単です。

std::map<int, int> a; 
std::cout << a.size(); //0 
int b = a[0]; 
std::cout << a.size(); //1 

ライブ例:http://ideone.com/z7PIRx

1

はい、マップはあなたのケースでは、キー0と値0を持つ新しいエントリを作成します。以下

http://www.cplusplus.com/reference/map/map/operator[]/

mapped_type &オペレータ[](CONST key_type & K)の[]動作について説明します。

kがコンテナ内の要素のキーと一致する場合、関数 は、マップされた値への参照を返します。 kが のキーと一致しない場合は、 というキーを持つ新しい要素を挿入し、マップされた値への参照を返します。

そして、人々がオペレーターを忘れた場合、[]は地図に存在しないときに新しいキーと値のペアを挿入することがあります。例えば、以下は、経時的な間違いです。

std::map<int,int> my_map; 

//check if 100 is in my_map 
if (my_map[100]) { 
    //some code 
} 

私はちょうど100がmy_map中かではなく、コードの上my_mapで新しいキー値を挿入するかどうかを確認したいです。この場合、私はちょうど100をチェックしたいならば、演算子[]の代わりにfindを使うべきです。

std::map<int,int> my_map; 

//check if 100 is in my_map 
if (my_map.find(100) != my_map.end()) { 
    //some code 
} 
関連する問題