map / set iterators不兼容 - 检查对象是否在map中

时间:2013-12-07 03:01:49

标签: c++ map iterator find

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

这是地图容器:

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的实际副本,因此最好使用引用类型。

非常感谢任何帮助。 谢谢

1 个答案:

答案 0 :(得分:1)

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