web-dev-qa-db-ja.com

挿入を行わずにstd :: mapにキーが含まれているかどうかを確認する方法は?

重複を確認する唯一の方法は、std::pair.secondを挿入してfalseを確認することですが、問題は、キーが使用されていない場合でも何かを挿入することですが、欲しいのはmap.contains(key);です関数。

138
jmasterx

my_map.count( key );を使用します0または1のみを返すことができ、これは基本的に必要なブール結果です。

または、my_map.find( key ) != my_map.end()も機能します。

284
Potatoswatter

Potatoswatterの答えは大丈夫ですが、代わりにfindまたはlower_boundを使用することを好みます。 lower_boundは、同じキーを持つものを挿入したい場合に、返された反復子を後でヒント付き挿入に使用できるため、特に便利です。

map<K, V>::iterator iter(my_map.lower_bound(key));
if (iter == my_map.end() || key < iter->first) {    // not found
    // ...
    my_map.insert(iter, make_pair(key, value));     // hinted insertion
} else {
    // ... use iter->second here
}
46

Desideratum、map.contains(key)は、ドラフト標準 C++ 2a に予定されています。 2017年に gcc 9.2 で実装されました。現在の clang にもあります。

0