【问题标题】:map/set iterators incompatible - checking to see if object is in map映射/设置迭代器不兼容 - 检查对象是否在映射中
【发布时间】:2013-12-07 03:01:49
【问题描述】:

我正在尝试搜索我的地图以查看 Person 接收的对象(消息)是否已包含在他们的地图中。

这是地图容器:

std::map<MessageContent, unsigned int>  messageList;

这是我对 find() 函数的调用:

if(listOfPersons.at(y).getMessageList().find(*tempMessage.getMessageContent()) 
                                    != listOfPersons.at(y).getMessageList().end())

这里是 getMessageContent():

MessageContent* Message::getMessageContent() const
{
    return mc;
}

最后是 getMessageList() 函数

std::map<MessageContent, unsigned int> Persons::getMessageList() const
{
    return messageList;
}

也与手头的话题有关,我认为我使用 return messageList; 不正确,因为我认为这种类型的返回返回的是 messageList 的实际副本,因此最好使用引用类型。

非常感谢任何帮助。 谢谢你

【问题讨论】:

    标签: c++ map iterator find


    【解决方案1】:

    当您return messageList 时,您确实做错了什么:您正在按照您所说的那样制作副本,这不仅是性能问题(可能),而且在您的情况下,它是一个严重的错误,正如您所说getMessageList() 两次并在其中一个上执行 find() 并在另一个上执行 end() 。这会调用未定义的行为,因为您正在比较来自两个不同容器的两个迭代器。按照你的建议让函数返回一个引用,这个问题就会得到解决。

    【讨论】:

    • 那么在这种情况下,我是否将完整的函数定义更改为std::map&lt;MessageContent, unsigned int&gt;&amp; Persons::getMessageList() const { return messageList; }
    • 我只启动了返回 messageList 的代码,因为我收到关于返回 messageList 作为参考的时髦智能错误。据我了解,我声明 std::map&lt;&gt;&amp;
    • 是的,没错。为了便于输入,请在某处为地图类型编写 typedef,并在所有地方使用它。
    • 在我将声明更改为 std::map&lt;MessageContent, unsigned int&gt;&amp; Persons::getMessageList() const 后,我在返回 return messageList 时遇到错误。具体来说:error: qualifiers dropped when binding in reference of type std::map
    • 或者这是因为我在最后使用const.....因为程序在我删除 const 后编译。
    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多