我正在使用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不在地图中。因为我的程序总是在这里收到错误,但我无法弄清楚原因。对这里发生的事情有任何帮助吗?
答案 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。