我的用例:
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 ++做最好和最优雅的方式?感谢。
答案 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 );