STL映射存储搜索到的密钥

时间:2009-05-13 18:14:26

标签: c++ stl

我刚刚发现当我搜索地图时:

  std::map<std::string, int> aMap;

我搜索的键开始成为地图的一部分。在上面的情况下,值存储为零。在指针的情况下,它将值存储为0值指针

我正在使用[]运算符进行搜索,例如:

  int a = aMap["some key"];

你能证实吗?我想我误解了[]运算符。它在做作业吗?!

在哪里可以找到这些“功能”的STL文档?

7 个答案:

答案 0 :(得分:8)

您是否使用[]运算符进行搜索?如果是,那么是的,这是定义的行为。

如果您不想要此行为,则应使用'find'方法。

STL的一个很好的参考是Nicolai Josuttis的书。

答案 1 :(得分:3)

如果使用[]运算符查看地图,则是,您将生成默认对象。另一方面,如果你使用'find',它就不会。这是因为[]运算符必须返回对地图中对象的引用,所以除了生成一个(如果还没有)之外别无选择。

答案 2 :(得分:2)

这背后的原因是: []定义为

T& operator[](KEY k)

引用永远不能为NULL,因此必须返回一些值。 STL通过插入默认的初始化元素来解决这个问题。

答案 3 :(得分:2)

int a = aMap["some key"];

这里映射检查以查看关键字“某个键”是否已经存在于地图中:

  • 如果是,那么参考 返回与“Some key”对应的值。
  • 如果地图中不存在“某些键”,那么 键“Some Key”以默认值插入地图中。 新插入值的引用将是 返回。

测试一个键是否在地图中退出(没有添加地图键)的正确方法是:

std::map<key,value>::iterator iter = myMap.find("Some Key");
if( iter != myMap.end())
{
 //key exists
}
else
{
 //no key
}

答案 4 :(得分:1)

你如何搜索???

if(!aMap[key]) // not found

这是不正确的,一旦通过operator []访问地图,就会创建一个合适的地方并返回引用。

您需要使用

if(aMao.find(key)==aMap.end()) // not found

答案 5 :(得分:1)

听起来你正在使用括号运算符,即

if (aMap["string"] == something)

不要那样做。相反,使用map :: find。

如果不存在,括号运算符将自动将键插入到地图中,使用值部分的默认值。

答案 6 :(得分:1)

如果通过搜索你的意思是使用operator [],就像这样:

if ( m["foo"] == 42 ) {
  // found
}
else {
  // not
}

然后是的,如果它还不存在,那将为“foo”创建一个条目。因此,您通常应该避免对map使用operator [],而是使用命名函数sfind()和insert()代替。

至于在哪里可以找到有关此行为的信息,标准库上最好的书是The C++ Standard Library by Nicolai Josuttis