C++ 映射/设置迭代器不兼容-检查对象是否在映射中

C++ 映射/设置迭代器不兼容-检查对象是否在映射中,c++,map,iterator,find,C++,Map,Iterator,Find,我正在尝试搜索我的地图,以查看此人接收的对象(消息)是否已包含在其地图中 这是地图容器: std::map<MessageContent, unsigned int> messageList; 下面是getMessageContent(): 最后是getMessageList()函数 std::映射人员::getMessageList()常量 { 返回消息列表; } 同样与手头的主题相关,我想我使用的是returnmessagelist错误,因为我认为这种类型的返回返回的是me

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

这是地图容器:

std::map<MessageContent, unsigned int>  messageList;
下面是getMessageContent():

最后是getMessageList()函数

std::映射人员::getMessageList()常量
{
返回消息列表;
}
同样与手头的主题相关,我想我使用的是
returnmessagelist错误,因为我认为这种类型的返回返回的是messageList的实际副本,所以最好使用引用类型

非常感谢您的帮助。
谢谢你

当你
返回消息列表时,你确实做错了一些事情:你正在按你说的做一个副本,这不仅是性能问题(可能),而且在你的情况下,这是一个严重的错误,因为你两次调用getMessageList(),一次调用find(),另一次调用end()。这将调用未定义的行为,因为您正在比较来自两个不同容器的两个迭代器。按照您的建议使函数返回一个引用,问题就会得到解决。

那么,在这种情况下,我是否要将完整的函数定义更改为
std::map&Persons::getMessageList()const{return messageList;}
我只启动了带有返回消息列表的代码,因为我收到了关于返回消息列表作为参考的令人毛骨悚然的intelliSense错误。据我所知,我声明返回
std::map&
Yes,这是正确的。为了便于键入,请在某个位置为映射类型编写一个typedef,并在所有位置使用它。在我将声明更改为读取
std::map&Persons::getMessageList()const
后,我仅返回
return messageList
时出错。具体来说:
错误:在std::map类型的引用中绑定时删除了限定符
,或者这是因为我在最后使用了
const
。…因为程序在我删除const之后进行编译。
if(listOfPersons.at(y).getMessageList().find(*tempMessage.getMessageContent()) 
                                    != listOfPersons.at(y).getMessageList().end())
MessageContent* Message::getMessageContent() const
{
    return mc;
}
std::map<MessageContent, unsigned int> Persons::getMessageList() const
{
    return messageList;
}