确定映射是否包含键的值?
确定一个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; }