2016-06-13 6 views
1

m1[0]が割り当てられているかどうかを知りたいのですが、このように試してみて、正しいと思われる「1」を印刷します。それを行う適切な方法ですか、それとももっと良い解決策ですか?マッチングの存在を確認する方法は?

int main(int argc, char const *argv[]){ 
    map<int, char> m1; 
    //cout << m1[0] << endl; 
    if(m1[0] == NULL) cout << "1" << endl; 
    else cout << "0" << endl; 
} 
+0

の可能性のある重複[キーが存在しない場合は、なぜのstd ::マップ演算子は、\ [\]オブジェクトを作成しますか?](http://stackoverflow.com/questions/1639544/why-does- stdmap-operator-create-an-object-if-the-key-doesnt-exist) – Viatorus

答えて

3

キーの存在を確認するのではなく、キーに割り当てられた値がNULL(の場合は'\0')かどうかを確認するだけです。

auto it = m1.find(0); 
if (it != m1.end()) std::cout << "0: " << it->second << "\n"; 
else cout << "Not found." << endl; 

を、キーが存在しない場合std::map::operator[]value_typeオブジェクトを挿入することに注意してください:

あなたはstd::map::findを使用する必要があります。この場合、値はvalue-initializedになります。charの場合、ゼロで初期化されます('\0')。したがってm1[0]は最初に挿入を行い、次にm1[0] == NULLtrueを返します。そのため、コードが正しいようです。

+0

私はそれを手に入れました。ありがとうございました –

+0

@Vincent_Bryanよろしくお願いします。 – songyuanyao

2

m1.find(key)を使用すると、結果がない場合はm1.end()が返されます。

さらに、m1[key]の代わりにm1.at(key)を使用できます。そのような要素がない場合は、std::out_of_range例外がスローされます。

1

他にも、map :: findまたはmap :: atを使用して要素の存在を確認してください。私は、[]演算子が存在しない場合は、指定された要素を追加して、マップを変更するためにチェックのために使用することはできないと言いました(まだコメントできません)。

1

これは正しくありません。0がまだマップにない場合は、コードに値0が追加されます。 0NULLに等しいので、これはコードが0という値を0に割り当てるかどうかをコードがテストしていることを意味します。キー0がすでにマップに入っているかどうかはテストされていません。

キーがマップに存在するかどうかをテストするには、count()関数を使用します。キーが存在する場合は1、そうでない場合は0を返します。

int main(int argc, char const *argv[]) { 
    map<int, char> m1; 
    count << (m1.count(0) ? "0" : "1") << '\n'; 
} 
関連する問題