如何查找std :: map中是否存在元素?

时间:2010-05-06 14:38:06

标签: c++

我的用例:

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;
} 

你能否建议用C ++做最好和最优雅的方式?感谢。

11 个答案:

答案 0 :(得分:73)

return cars.find(name) != cars.end();

答案 1 :(得分:57)

当然,使用迭代器

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

答案 2 :(得分:25)

您也可以使用

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

答案 3 :(得分:19)

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

您可以使用特定键调用map :: count(key);它将返回给定键存在的条目数。对于具有唯一键的地图,结果将为0或1.由于multimap也存在相同的界面,因此最好与!= 0进行比较以确保存在安全。

为你的例子,那是

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

我看到的优点是 1.更短的代码, 2.利用其表示细节,可以从库内部应用的任何优化中受益。

答案 4 :(得分:7)

怎么样:

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使用特殊版本,因为它提供了更有效的搜索替代方案。您可以根据需要添加其他专精(例如,std::set和其他)。

答案 5 :(得分:5)

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

答案 6 :(得分:3)

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

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

答案 7 :(得分:1)

bool exists(const std::map<std::string, Car>& cars, const std::string& name) {
  return cars.end() != cars.find(name);
}

答案 8 :(得分:0)

#define itertype(v) typeof((v).begin())
itertype(cars) it = cars.find(name);
return it != cars.end();

答案 9 :(得分:0)

C ++ 20:

return cars.contains(name);

答案 10 :(得分:0)

这不能回答问题,但可能会很高兴。您可以通过擦除来知道它是否存在。

bool existed = cars.erase( name );