【问题标题】:Why isn't my simple map.find(x) working?为什么我的简单 map.find(x) 不起作用?
【发布时间】:2014-07-03 06:13:04
【问题描述】:

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

代码如下:

地图是这样定义的:

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 函数(调用 insert())。从http://msdn.microsoft.com/en-us/library/92cwhskb.aspx 我得到,find() 的返回值要么是元素,要么是正在寻找的元素 - 或者如果它不可用,它是 objects.end()

调试时地图对象已经包含&lt;'a',anObject&gt;,然后我尝试添加&lt;'b',anotherObject&gt;,但正如我所说,他从未使用过insert() 函数,我不明白为什么.

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

有人有想法吗?

【问题讨论】:

  • 注意:您不必对此进行检查。如果密钥已经存在,则不会插入它。
  • 我发现这仅在第一个和第二个键匹配时才有效。因此可以添加对,例如:&lt;'a',anotherObject&gt;,然后添加 &lt;'b',anotherObject&gt;
  • @user3085931:std::map 就是这样工作的。它只查看比较和排序 [key-value] 对的键。价值就在旅途中。
  • @Blastfurnace 这就是我使用if()检查它的原因
  • @user3085931:您似乎对 Rapptz 的评论和 Matthieu M. 的回答感到困惑。 std::map 中的键保证是唯一的。如果你尝试insert() 一个重复的键,它不会被添加,你可以通过函数的返回值来判断。

标签: c++ debugging map insert find


【解决方案1】:

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

那你需要(==):

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 如果在范围内找不到键。因此,您需要检查是否相等。

【讨论】:

    【解决方案2】:

    正如 40two 所说,您的布尔条件是相反的。

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

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

    因此,在你的情况下:

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

    是实现目标的最简单的sn-p。

    提示:注意make_pair 的使用,它会自动推断其参数的类型,因此您不必重复它。

    【讨论】:

    • 后来我用make_pair试试,但正如顶帖评论中提到的:我发现地图的所有条目都是唯一的并不可靠。
    • @user3085931:我不明白你在说什么。 std::make_pair(objectName, object) 产生的结果std::pair&lt;std::string, ownObject*&gt;(objectName, object) 完全相同,这与映射中键的唯一性无关(对可以在映射之外使用)。此外,地图可靠地保证的唯一性。他们不保证键/值对的唯一性,或值的唯一性,按设计......你的if 也不会检查,它只检查键的存在。
    • 字符串键来自objects.Name(),在我的应用程序中它是唯一的算法,问题是要确保一个对象在地图中没有两次,并且可以很容易地找到。
    猜你喜欢
    • 1970-01-01
    • 2014-10-28
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多