如何查找给定的键是否存在于C ++ std :: map中

我试图检查给定的键是否在地图上,有些不能这样做:

typedef map<string,string>::iterator mi; map<string, string> m; m.insert(make_pair("f","++--")); pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want cout << p.first;//I'm getting error here 

那我该如何打印p中的内容呢?

使用map::find

 if ( m.find("f") == m.end() ) { // not found } else { // found } 

要检查映射中的特定键是否存在,请使用以下某种方法使用count成员函数:

 m.count(key) > 0 m.count(key) == 1 m.count(key) != 0 

map::find的文档说:“另一个成员函数map::count可以用来检查一个特定的键是否存在。”

map::count的文档说:“因为地图容器中的所有元素都是唯一的,所以函数只能返回1(如果find元素)或者返回0(否则)。

要通过您知道存在的键从地图中检索值,请使用map :: at :

 value = m.at(key) 

与map :: operator []不同 ,如果指定的键不存在, map::at将不会在映射中创build新的键。

你可以使用.find()

 map<string,string>::iterator i = m.find("f"); if (i == m.end()) { /* Not found */ } else { /* Found, i->first is f, i->second is ++-- */ } 
 m.find == m.end() // not found 

如果你想使用其他的API,那么findm.count(c)>0

  if (m.count("f")>0) cout << " is an element of m.\n"; else cout << " is not an element of m.\n"; 

我想你想要map::find 。 如果m.find("f")等于m.end() ,那么找不到密钥。 否则,find会返回一个指向find的元素的迭代器。

该错误是因为p.first是一个迭代器,它不适用于stream插入。 把你最后一行cout << (p.first)->first;p是一对迭代器, p.first是一个迭代器, p.first->first是关键string。

一个映射只能有一个给定的键的元素,所以equal_range不是很有用。 它是为map定义的,因为它是为所有的关联容器定义的,但是它对于multimap更有趣。

在比较查找结果和地图'm'的结尾时要小心,因为所有的答案都已经完成了上面的map:iterator i = m.find(“f”);

  if (i == m.end()) { } else { } 

如果其等于m.end(),则不应尝试执行任何操作,如使用迭代器i打印键或值,否则将导致分段错误。

 map<string, string> m; 

检查键是否存在,并返回发生的数字(地图中的0/1):

 int num = m.count("f"); if (num>0) { //found } else { // not found } 

检查键是否存在,并返回迭代器:

 map<string,string>::iterator mi = m.find("f"); if(mi != m.end()) { //found //do something to mi. } else { // not found } 

在你的问题中, operator<<重载导致的错误,因为p.firstmap<string, string> ,你不能打印出来。 尝试这个:

 if(p.first != p.second) { cout << p.first->first << " " << p.first->second << endl; } 
 template <typename T, typename Key> bool key_exists(const T& container, const Key& key) { return (container.find(key) != std::end(container)); } 

当然,如果你想变得更漂亮,你总是可以模仿一个函数,也可以find一个函数和一个没有find的函数,像这样:

 template <typename T, typename Key, typename FoundFunction, typename NotFoundFunction> void find_and_execute(const T& container, const Key& key, FoundFunction found_function, NotFoundFunction not_found_function) { auto& it = container.find(key); if (it != std::end(container)) { found_function(key, it->second); } else { not_found_function(key); } } 

像这样使用它:

  std::map<int, int> some_map; find_and_execute(some_map, 1, [](int key, int value){ std::cout << "key " << key << " found, value: " << value << std::endl; }, [](int key){ std::cout << "key " << key << " not found" << std::endl; }); 

这样做的缺点是有一个好名字,“find_and_execute”是尴尬的,我不能拿出更好的东西在我的头顶…

比较std :: map :: find和std :: map :: count的代码,我会说第一个可能会产生一些性能优势:

 const_iterator find(const key_type& _Keyval) const { // find an element in nonmutable sequence that matches _Keyval const_iterator _Where = lower_bound(_Keyval); // Here one looks only for lower bound return (_Where == end() || _DEBUG_LT_PRED(this->_Getcomp(), _Keyval, this->_Key(_Where._Mynode())) ? end() : _Where); } size_type count(const key_type& _Keyval) const { // count all elements that match _Keyval _Paircc _Ans = equal_range(_Keyval); // Here both lower and upper bounds are to be found, which is presumably slower. size_type _Num = 0; _Distance(_Ans.first, _Ans.second, _Num); return (_Num); } 

如果你想比较一下地图,你可以使用这个方法:

 typedef map<double, double> TestMap; TestMap testMap; pair<map<double,double>::iterator,bool> controlMapValues; controlMapValues= testMap.insert(std::pair<double,double>(x,y)); if (controlMapValues.second == false ) { TestMap::iterator it; it = testMap.find(x); if (it->second == y) { cout<<"Given value is already exist in Map"<<endl; } } 

这是一个有用的技术。