我刚刚发现当我搜索地图时:
std::map<std::string, int> aMap;
我搜索的键开始成为地图的一部分。在上面的情况下,值存储为零。在指针的情况下,它将值存储为0值指针
我正在使用[]运算符进行搜索,例如:
int a = aMap["some key"];
你能证实吗?我想我误解了[]运算符。它在做作业吗?!
在哪里可以找到这些“功能”的STL文档?
答案 0 :(得分:8)
您是否使用[]运算符进行搜索?如果是,那么是的,这是定义的行为。
如果您不想要此行为,则应使用'find'方法。
STL的一个很好的参考是Nicolai Josuttis的书。
答案 1 :(得分:3)
如果使用[]运算符查看地图,则是,您将生成默认对象。另一方面,如果你使用'find',它就不会。这是因为[]运算符必须返回对地图中对象的引用,所以除了生成一个(如果还没有)之外别无选择。
答案 2 :(得分:2)
这背后的原因是: []定义为
T& operator[](KEY k)
引用永远不能为NULL,因此必须返回一些值。 STL通过插入默认的初始化元素来解决这个问题。
答案 3 :(得分:2)
int a = aMap["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。