std::map的find的简单问题,求助!!

weichen2005 2009-02-06 11:09:23
如下代码,我想从map中找到一个对象,但发现不应该被找到的对象居然找到了
不知道什么原因,请大家帮忙

比如: 类c2有两个整形成员, 我往map里放了(1,2), (2,2), (3,2)三个key值
然后去找(1,10)这个key, 发现找到了(1,2)这个key

#include <iostream>
#include <string>
#include <map>

using namespace std;

class c2 {
public:
c2(int i, int j);
int m_id;
int m_id2;
};
c2::c2(int i, int j) {
m_id = i;
m_id2 = j;
}
struct ltc2
{
bool operator()(const c2& p1, const c2& p2) const
{
//return strcmp(s1, s2) < 0;
return p1.m_id < p2.m_id;
}
};

int main() {
map<c2,int,ltc2> m2;
c2 c_21(1, 2);
c2 c_22(2, 2);
c2 c_23(3, 2);

m2[c_21] = 11;
m2[c_22] = 22;
m2[c_23] = 33;

c2 to_find2(1, 10);
map<c2,int,ltc2>::iterator iter3;
iter3 = m2.find(to_find2);
if (iter3==m2.end()) {
cout << "--not found" << endl;
} else {
cout << "--found: " << iter3->first.m_id << ","
<< iter3->second << endl;
}

return 0;
}

...全文
1986 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
harry330 2009-02-14
  • 打赏
  • 举报
回复
map的查找是基于等价的,不是基于相等的。
用3楼的方法可以解决。否这重载C2类的 >运算符
捕鲸叉 2009-02-13
  • 打赏
  • 举报
回复
multimap?
hhyttppd 2009-02-06
  • 打赏
  • 举报
回复

struct ltc2
{
bool operator()(const c2& p1, const c2& p2) const
{
if( p1.m_id < p2.m_id) return true;
else if( p1.m_id > p2.m_id) return false;

return p1.m_id2 < p2.m_id2;
}
};


注意map比较相等用的条件不是: left == right
而是类似于 !(left < right ) && !(right < left)
ltc_mouse 2009-02-06
  • 打赏
  • 举报
回复
试试

struct ltc2
{
bool operator()(const c2& p1, const c2& p2) const
{
return (p1.m_id < p2.m_id) || ( (p1.m_id == p2.m_id ) && p1.m_id2 < p2.m_id2 );
}
};
weichen2005 2009-02-06
  • 打赏
  • 举报
回复
这个是什么原因呢?

难道map查找时不是以整个class的二进制位表示方式在查找的???

这个问题如何解决呢?
hhyttppd 2009-02-06
  • 打赏
  • 举报
回复
问题出在键上c2上,m_id2没有起到键的作用。


du51 2009-02-06
  • 打赏
  • 举报
回复
要遵守严格弱序
waizqfor 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ltc_mouse 的回复:]
试试

C/C++ code
struct ltc2
{
bool operator()(const c2& p1, const c2& p2) const
{
return (p1.m_id < p2.m_id) || ( (p1.m_id == p2.m_id ) && p1.m_id2 < p2.m_id2 );
}
};
[/Quote]
up
hhyttppd 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hastings 的回复:]
同意4楼,请仔细了解一下map类的实现,或者看看map类的使用说明。
[/Quote]

其实跟3楼的一样。
InfidelX 2009-02-06
  • 打赏
  • 举报
回复
mark
hastings 2009-02-06
  • 打赏
  • 举报
回复
同意4楼,请仔细了解一下map类的实现,或者看看map类的使用说明。

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧