为什么我的简单map.find(x)不起作用?

时间:2014-07-03 06:13:04

标签: c++ debugging map insert find

当我尝试在我的C ++程序中使用find() map时,该函数似乎无法正常工作。

以下是代码:

地图的定义如下:

std::map<std::string,ownObject*> objects;

这里是没有运行的代码

void someClass::addTarget(std::string objectName, ownObject* object)
{
if (this->objects.find(objectName) != this->objects.end())
    this->objects.insert(std::pair<std::string,ownObject*>(objectName,object));
}

我的实际意图是,检查是否已存在具有该名称的条目(地图的第一个键),如果没有将其添加到地图中。

现在由于某种原因,他永远不会进入if-function(调用insert())。从我http://msdn.microsoft.com/en-us/library/92cwhskb.aspx开始,find()的返回值是要求的元素 - 或者如果它不可用则是objects.end()

调试时地图对象已包含<'a',anObject>,然后我尝试添加<'b',anotherObject>,但正如我所说,他从未进入insert()功能,我不明白为什么。

正如在给定主页上所解释的那样(实际上是用他们的问题进行了尝试),这实际上应该有效,所以不幸的是我甚至不知道问题出在哪里。

有人有想法吗?

2 个答案:

答案 0 :(得分:3)

  

我的目的是检查是否已有一个具有该名称的条目(地图的第一个键),如果没有将其添加到地图中。

然后你需要(==):

void someClass::addTarget(std::string objectName, ownObject* object)
{
if (this->objects.find(objectName) == this->objects.end())
    this->objects.insert(std::pair<std::string,ownObject*>(objectName,object));
}
如果在范围内找不到密钥,

std::map::find将返回std::map::end。因此,您需要检查是否相等。

答案 1 :(得分:2)

如40two所述,您的布尔条件相反。

但是,实际上需要检查的前提是不成立的。在C ++中,有两种方法可以在map中插入新值:

  • insert / emplace:如果密钥不存在,则插入密钥/值对
  • []:产生对与该键相关联的值的引用,在必要时创建默认值(即,该键不存在时开始)

因此,在您的情况下:

this->objects.insert(std::make_pair(objectName, object));

是实现目标的最简单的代码段。

提示:请注意使用make_pair自动推断其参数类型,以便您不必重复它。