c++ std::set 自定义类型插入set后查找不到

利剑出鞘2012 2017-03-01 09:22:53
在C++中,我自定义了一个数据类型,重载了小于和等于运算符,插入一个元素后查找不到,怎么回事?现在我想只要前两个成员相等就相当于一个元素,我将Record("aaa",2)插入后,在调用find,却查找不到,求解?Set不是根据==来判断是否为同一个元素吗?
class Record
{
public:
string fileName;
int lineNum;
int freq;
int firstAppear;
Record(string filename,int lineNum):fileName(filename),lineNum(lineNum)
{

}
bool operator == (const Record& record0) const{
return (fileName == record0.fileName) && (lineNum == record0.lineNum);
}
bool operator < (const Record& info) const
{
return (freq>info.freq)||(freq==info.freq && firstAppear<info.firstAppear);
}
};
...全文
623 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2017-03-02
  • 打赏
  • 举报
回复
引用 7 楼 u012736651 的回复:
[quote=引用 4 楼 pengzhixi的回复:]严格的弱序关系就是会这么判断:如果a<b和b<a都不成立那么就认为是同一个键值
我现在问的不是顺序问题,而是怎么查找里面的元素(键为自定义类型)?[/quote]查找不也是通过比较来查找的么?
幻夢之葉 2017-03-01
  • 打赏
  • 举报
回复
自定义类型则必须重载<操作符
幻夢之葉 2017-03-01
  • 打赏
  • 举报
回复
排序 查找默认都是根据<来判断
利剑出鞘2012 2017-03-01
  • 打赏
  • 举报
回复
引用 4 楼 pengzhixi的回复:
严格的弱序关系就是会这么判断:如果a<b和b<a都不成立那么就认为是同一个键值
我现在问的不是顺序问题,而是怎么查找里面的元素(键为自定义类型)?
利剑出鞘2012 2017-03-01
  • 打赏
  • 举报
回复
引用 5 楼 Aer.的回复:
set和map不允许有相同的key值
Key只能是基本数据类型吗?
Aer. 2017-03-01
  • 打赏
  • 举报
回复
set和map不允许有相同的key值
pengzhixi 2017-03-01
  • 打赏
  • 举报
回复
严格的弱序关系就是会这么判断:如果a<b和b<a都不成立那么就认为是同一个键值
幻夢之葉 2017-03-01
  • 打赏
  • 举报
回复
默认的是根据operator <来排序的 判断相等与否只需要执行两次<比较 lhs rhs //两个操作数 if (!(lhs < rhs) && !(rhs < lhs)) // 分别不小于对方,即为相等
利剑出鞘2012 2017-03-01
  • 打赏
  • 举报
回复
引用 1 楼 pengzhixi 的回复:
是按严格的弱序关系,不是相等关系的 operator<
那么,set中的元素不允许重复,那么set是如何判断两个元素相等的?如果是基本类型,比如set<string>,我两次都插入"hello",它只会有一个被保存,那么问题来了,它怎么知道我两次插入的是同一个元素,根据什么判断它是同一个元素?
pengzhixi 2017-03-01
  • 打赏
  • 举报
回复
是按严格的弱序关系,不是相等关系的 operator<

64,649

社区成员

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

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