确定映射是否包含键的值?

确定一个STL映射是否包含给定键的值的最好方法是什么?

#include <map> using namespace std; struct Bar { int i; }; int main() { map<int, Bar> m; Bar b = {0}; Bar b1 = {1}; m[0] = b; m[1] = b1; //Bar b2 = m[2]; map<int, Bar>::iterator iter = m.find(2); Bar b3 = iter->second; } 

在debugging器中检查它,看起来像是垃圾数据。

如果我取消注释掉这一行:

 Bar b2 = m[2] 

debugging器显示b2{i = 0} 。 (我猜这意味着使用未定义的索引将返回一个结构与所有空/未初始化的值?)

这些方法都不是那么好。 我真的很喜欢这样的界面:

 bool getValue(int key, Bar& out) { if (map contains value for key) { out = map[key]; return true; } return false; } 

有这样的线路存在吗?

有这样的线路存在吗?

不。使用stl map类,您可以使用::find()来search地图,并将返回的迭代器与std::map::end()

所以

 map<int,Bar>::iterator it = m.find('2'); Bar b3; if(it != m.end()) { //element found; b3 = it->second; } 

显然你可以编写你自己的getValue()例程,如果你想(也是在C ++中,没有理由使用),但是我会怀疑,一旦你使用std::map::find()不想浪费你的时间。

另外你的代码有点不对

m.find('2'); 将在地图上search'2'的键值。 IIRC C ++编译器会隐式地将“2”转换为一个int,这将导致“2”的ASCII代码的数字值不是您想要的值。

由于你在这个例子中的键types是int你想像这样search: m.find(2);

只要地图不是多图,最好的方法之一就是使用count方法

 if (m.count(key)) // key exists 

如果元素确实存在于地图中,则计数为1。

它已经存在与查找不只是在确切的语法。

 if (m.find(2) == m.end() ) { // key 2 doesn't exist } 

如果您想访问该值,如果它存在,您可以执行:

 map<int, Bar>::iterator iter = m.find(2); if (iter != m.end() ) { // key 2 exists, do something with iter->second (the value) } 

使用C ++ 0x和auto,语法更简单:

 auto iter = m.find(2); if (iter != m.end() ) { // key 2 exists, do something with iter->second (the value) } 

我build议你习惯它,而不是试图想出一个新的机制来简化它。 你可能会减less一些代码,但考虑到这样做的成本。 现在您已经介绍了一个熟悉C ++的人不能识别的新function。

无论如何,尽pipe有这些警告,你仍然想要实现这一点,那么:

 template <class Key, class Value, class Comparator, class Alloc> bool getValue(const std::map<Key, Value, Comparator, Alloc>& my_map, int key, Value& out) { typename std::map<Key, Value, Comparator, Alloc>::const_iterator it = my_map.find(key); if (it != my_map.end() ) { out = it->second; return true; } return false; } 

amap::end找不到你要找的东西时, amap.find返回amap::end – 你应该检查一下。

查看find的返回值。

 map<int, Bar>::iterator iter = m.find('2'); if ( map.end() != iter ) { // contains ... } 

你可以用下面的代码创build你的getValue函数:

 bool getValue(const std::map<int, Bar>& input, int key, Bar& out) { std::map<int, Bar>::iterator foundIter = input.find(key); if (foundIter != input.end()) { out = foundIter->second; return true; } return false; } 

如果你想确定一个键是否在map中,你可以使用map的find()或count()成员函数。 在这个例子中使用的find函数返回迭代器元素或map :: end,否则返回。 在计数的情况下,计数返回1,否则返回零(否则)。

 if(phone.count(key)) { //key found } else {//key not found } for(int i=0;i<v.size();i++){ phoneMap::iterator itr=phone.find(v[i]);//I have used a vector in this example to check through map you cal receive a value using at() eg: map.at(key); if(itr!=phone.end()) cout<<v[i]<<"="<<itr->second<<endl; else cout<<"Not found"<<endl; } 

Boost multindex可以用于正确的解决scheme。 下面的解决scheme并不是一个非常好的select,但是在less数情况下用户可以在初始化时分配默认值0或NULL,并希望检查值是否被修改。

 Ex. < int , string > < string , int > < string , string > consider < string , string > mymap["1st"]="first"; mymap["second"]=""; for (std::map<string,string>::iterator it=mymap.begin(); it!=mymap.end(); ++it) { if ( it->second =="" ) continue; }