确定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;

}

在调试器中检查它,iter看起来只是垃圾数据。

如果我取消注释这一行:

Bar b2 = m[2]

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

这两种方法都不是很好。我真正想要的是这样一个界面:

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

是否存在类似的情况?


当前回答

你可以用下面的代码创建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函数返回element或map::end的迭代器。 在count的情况下,如果找到count则返回1,否则返回0(或其他)。

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() e.g: map.at(key);
    if(itr!=phone.end())
        cout<<v[i]<<"="<<itr->second<<endl;
    else
        cout<<"Not found"<<endl;
}

根据end检查find的返回值。

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

同理。Find在没有找到你要找的东西时返回ammap::end——你应该检查它。

Map提供了2个成员函数来检查Map中给定的键是否存在不同的返回值。

Std::map::find(返回迭代器) Std::map::count(返回计数)

使用std::map::count检查map是否包含键

它查找并返回map中键为k的元素的数量,因为map只包含键为唯一的元素。因此,如果key存在,它将返回1,否则为0。

使用std::map::find检查map是否包含键

它检查map中是否存在键值为“k”的元素,如果存在,则返回其迭代器else 它返回map的结束。

更多细节和例子参考下面的链接(容易理解的解释)。

来源:https://thispointer.com/how-check-if-a-given-key-exists-in-a-map-c/

简单总结一下其他的一些答案:

如果你还没有使用c++ 20,你可以编写自己的mapContainsKey函数:

bool mapContainsKey(std::map<int, int>& map, int key)
{
  if (map.find(key) == map.end()) return false;
  return true;
}

如果你想避免map和unordered_map以及不同键和值类型的很多重载,你可以把它做成一个模板函数。

如果你使用c++ 20或更高版本,会有一个内置的contains函数:

std::map<int, int> myMap;

// do stuff with myMap here

int key = 123;

if (myMap.contains(key))
{
  // stuff here
}