2017-07-19 33 views
-1

我对C++中的集合不太了解,所以如果我的问题有点愚蠢,那就轻松点我。C++ std :: map在未找到密钥时添加值

我目前有2地图

map<int, Segment*> varSeg; 
map<Segment*, bool> rules; 

所以VARSEG充满VAR的分配 - >段*的对象,并根据一些逻辑我试图填补规则映射使用类似以下循环。

for(...looping on some vars){ 
    int segVar = getVar(); 
    rules[varSeg[segVar]] = (segVar > 0); 
} 

但是,如果某segVar是不是已经包含在varSeg我遇到了一个怪异的行为。在varSeg映射中创建了一个新条目,该映射的密钥为segVar,该段的值为Null。后来哪些原因导致了我的代码中的各种问题。

我的问题是为什么发生这种情况?是不是varSeg[segVar]声明这里是一个读取声明?这是非常难以调试,因为我无法在我的代码中找到一个地方我正在向地图写入空值。那么你能解释我在这里做错了什么吗?

+0

可能重复的[std :: map - 元素访问无例外,没有插入](https://stackoverflow.com/questions/19290780/stdmap-element-access-without-exception-and-without-insertion) – hobo

+0

你认为'varSeg [segVar]'的值如果它没有*添加任何东西到地图上,你认为什么? – molbdnilo

+0

实际上,我在代码中检查了它,但是由于一个小错误,检查后有时可能将值更改为负值,然后在搜索时它会添加映射为null的-ve键。 –

回答

4

我的问题是为什么发生这种情况?

因为这就是std::map::operator[]应该做的事情,正如文档中明确指出的那样。

如果您不想要这种(主要是有用的)行为,请使用find成员函数而不是[]

在任何情况下,你的代码会失败,即使[]没有创造一个新的元素(或者,如果你使用的find),因为你根本就没有处理情况segVarvarSeg发现的情况。

+0

感谢您的答复:)。该案件在我的代码中实际处理,但是我意外地将'segVar'的值更改为否定,导致了问题。看到阅读价值创造了空值,这太奇怪了。现在我明白了,谢谢。 –