在什么情况下,operator [] for std :: map会返回0?

时间:2016-03-25 21:59:46

标签: c++ c++11 llvm

我正在使用LLVM,我遇到了以下我没写过的代码问题:

static std::map<std::string, Value*> NamedValues;
... //Lots of other code
Value *V = NamedValues["Demo string"];
return V ? V : ErrorV("V is not in NamedValues map.");

根据我对std :: map的理解,它应该永远不会返回一个空指针(除非它没有内存?),所以我很难理解V是0表示V不在地图中。因为我的程序总是在这里收到错误,但我无法弄清楚原因。对这里发生的事情有任何帮助吗?

2 个答案:

答案 0 :(得分:6)

std::map::operator []返回对该值的引用(如果该键已存在),如果该键不存在,则将该键与default-construct值一起插入,并返回对该值的引用。

POD类型(如指针)在默认构造时具有零初始化。意味着如果指针默认构造,则指针将具有nullptr值。

如果在调用"Demo string"之前键NamedValues["Demo string"];不存在,则地图将创建一个默认的构造指针作为值,它将构造为nullptr

如果您想知道地图是否包含密钥,则需要使用find + end

if (map.find(yourKey) != map.end()){
  //the key exists
}

编辑:
正如@ShadowRanger所指出的,count也可以使用。

if (map.count(yourKey)){
   //the key exists
}

答案 1 :(得分:2)

Operator []将返回对地图中元素的引用。如果尚未存储,它将创建一个默认构造的。

在这种情况下,当您存储指针时,无论何时请求地图中尚未存在的键的值,您都可以获得nullptr。