如何find一个元素是否存在于std :: map中?

我的用例:

map<string, Car> cars; bool exists(const string& name) { // somehow I should find whether my MAP has a car // with the name provided return false; } 

你可以请build议最好的和最优雅的方式来做到这一点在C + +? 谢谢。

当然,使用迭代器

 map<string,Car>::const_iterator it = cars.find(name); return it!=cars.end(); 
 return cars.find(name) != cars.end(); 

你也可以使用

 bool exists(const string& name) { return cars.count(name) != 0; } 

除了来自find()的iterator-Value和与.end()的比较,还有另一种方法:map :: count。

你可以用特定的键调用map :: count(key) 它将返回给定密钥的条目数量。 对于具有唯一键的映射,结果将为0或1.由于multimap也存在以及相同的接口,所以存在的安全性较好,与!= 0进行比较。

对于你的例子,这是

 return (cars.count(name)>0); 

我所看到的优点是1.较短的代码,2.受益于图书馆可能在内部应用的任何优化,使用其表示细节。

关于什么:

 template <typename KeyType, typename Collection> bool exists_in(Collection const& haystack, KeyType const& needle) { return std::find(haystack.begin(), haystack.end(), needle) != haystack.end(); } template <typename K, typename V> bool exists_in(std::map<K,V> const& haystack, K const& needle) { return haystack.find(needle) != haystack.end(); } 

这使得exists_in可以通过std::find使用任何标准容器,并使用std::map的特殊版本,因为它提供了更高效的searchselect。 您可以根据需要添加额外的特化(例如,对于std::set和其他)。

 bool exists(const string& name) { return cars.find(name) != cars.end(); } 

std::map::find(const key_type& x );

如果该项不存在,则返回map::end

 bool exists(const std::map<std::string, Car>& cars, const std::string& name) { return cars.end() != cars.find(name); } 
 #define itertype(v) typeof((v).begin()) itertype(cars) it = cars.find(name); return it != cars.end();