2009-05-13 5 views
3

を検索しました。上記の場合、値はゼロとして格納されます。STLのmap店は、私はちょうど私のようなマップを検索するときにことを見出したキー

int a = aMap["some key"]; 

あなたがこれを確認できますか?A:ポインタの場合、それはのように私は、[]演算子で検索をしています0大切なポインタ

として値を格納しますか私は[]演算子を誤解していると思う。割り当てをしていますか?

これらの種類の「機能」に関するSTL文書はどこにありますか?

答えて

8

[]演算子で検索していますか?そうであれば、これは定義された動作です。

この現象が発生しないようにするには、 'find'メソッドを使用する必要があります。

STLの参考資料は、Nicolai Josuttisの本です。

1

どのように検索しますか?

if(!aMap[key]) // not found 

これは正しくありませんが、演算子[]でマップにアクセスすると適切な場所が作成され、参照が返されます。

あなたはそれをしないでください

if (aMap["string"] == something) 

すなわち

、あなたはブラケット演算子を使っているようですね

if(aMao.find(key)==aMap.end()) // not found 
1

を使用する必要があります。代わりに、map :: findを使用します。

ブラケット演算子は、キーが存在しない場合は値の部分にデフォルトを使用してマップに自動的に挿入します。

3

[]演算子を使用してマップを見ると、デフォルトのオブジェクトが生成されます。一方、 'find'を使うと、それはしません。これは、[]演算子がマップ内のオブジェクトへの参照を返さなければならないため、選択肢がありません。

1

検索であなたはこのように、[]演算子を使用することを意味した場合:その後、

if (m["foo"] == 42) { 
    // found 
} 
else { 
    // not 
} 

はい、それはまだ存在しない場合は「foo」というのエントリを作成すること。このため、一般には、マップにoperator []を使用しないで、代わりに名前付き関数sfind()とinsert()を使用する必要があります。

この動作に関する情報の参照先は、標準ライブラリのベストブックはThe C++ Standard Library by Nicolai Josuttisです。

2

この背後にある理由がある:A参照がnullになることはありません []に定義されて

T& operator[](KEY k) 

として、ので、いくつかの値が返されなければなりません。 STLは、デフォルトの初期化要素を挿入することでこれを解決します。

2
ここ
int a = aMap["some key"]; 

マップの確認キー「いくつかのキーは」すでにあるマップが存在するかどうかを確認するために:

  • はい、その後 の参照は、「いくつかのキー」に対応する値が返された場合。
  • "some key"がマップに存在しない場合、 キー「Some Key」がデフォルト値でマップに挿入されます。 新たに挿入された値の参照は になります。

(マップするキーを追加せずに)マップ内のキー終了するかどうかをテストする正しい方法は次のとおり

std::map<key,value>::iterator iter = myMap.find("Some Key"); 
if(iter != myMap.end()) 
{ 
//key exists 
} 
else 
{ 
//no key 
} 
関連する問題