2016-03-25 17 views
4

私はLLVMで働いている、と私は私が書いていない次のコードで問題を抱えている:std :: mapのoperator []はどのような状況で0を返しますか?

static std::map<std::string, Value*> NamedValues; 
... //Lots of other code 
Value *V = NamedValues["Demo string"]; 
return V ? V : ErrorV("V is not in NamedValues map."); 

私はSTDの理解何より::マップは、nullを返すことはありません私はVが0であることがVが地図にないことを示す方法を理解するのに苦労しています。つまり、私のプログラムはいつもここでエラーになっていますが、私は理由を理解できません。ここで何が起こっているの?

答えて

6

std::map::operator []キーがすでに存在する場合はその値への参照を返し、キーが存在しない場合は、キーをデフォルト構成の値と共に挿入し、その値への参照を返します。

PODタイプ(ポインタなど)は、デフォルトの構築時にゼロ初期化を持ちます。そのデフォルトが構築されている場合、ポインタはnullptrの値を持つことを意味します。

NamedValues["Demo string"];を呼び出す前にキー"Demo string"が存在しない場合、マップは値としてデフォルト構築ポインタを作成し、nullptrとして構築されます。あなたがマップにキーが含まれているかどうかを確認したい場合は

は、あなたが使用する必要がfind + end

if (map.find(yourKey) != map.end()){ 
    //the key exists 
} 

EDIT:@ShadowRangerとして
が指摘した、countも同様に使用することができます。

if (map.count(yourKey)){ 
    //the key exists 
} 
+0

['count'メソッド](http://en.cppreference.com/w/cpp/container/map/count)は' find!= end'よりやや効率的ですが、いいえ?少なくとも(map.count(yourKey)){'は' map'sが一意のキーを持っているので、見つかった場合は '1'を返し、見つからない場合は' 0'を返します。注:上向きに投票され、ちょうど微調整を行うことができます。 – ShadowRanger

+1

@ShadowRanger findは、マップを2回検索する必要がないため、値が見つかった場合(OPコードが行う)値を使用したい場合は、より効率的です。 'count'メソッドは、それがそこにあるかどうかだけを知りたい場合は、より良い方法です。 – Galik

+0

@ギャリック:同意。私はもっ​​と注意を払うべきだった。この例のように 'find'の戻り値を格納しないと助けになりません。 – ShadowRanger

2

演算子[]はマップ内の要素への参照を返します。まだ格納されていない場合は、デフォルトで構築されたものを作成します。

この場合、ポインタを格納するときに、マップにまだ入っていないキーの値を要求するたびにnullptrを取得できます。

関連する問題