当我尝试在我的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()
功能,我不明白为什么。
正如在给定主页上所解释的那样(实际上是用他们的问题进行了尝试),这实际上应该有效,所以不幸的是我甚至不知道问题出在哪里。
有人有想法吗?
答案 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
自动推断其参数类型,以便您不必重复它。