C++的set中的find函数,具体什么原理啊,总不对呢

magicioney 2012-10-09 06:32:55
#include<iostream>
#include<string>
#include<set>
using namespace std;
class one
{
public:
string a;
string b;
one(string a,string b):a(a),b(b){}
bool operator <(const one& a)const{return this->b<a.b;}
/*bool operator ==(const one& a)const
{
return (this->a==a.a)||(this->b==a.b);
}*/
//这里如果改成{return this->a<a.a;}输出就是find!
//我试过重载 “==”算符 但是 对find函数没有影响。
//我重载了“==”算符 发现 这个只对两个one实例比较的时候有影响。
};
int main()
{
one a1("a","b");
set<one> book;
book.insert(a1);
set<one>::iterator iM=book.find(one("a","a"));
if(iM!=book.end())
cout<<"find!"<<endl;
else
cout<<"no!"<<endl;
return 0;
}

//输出是 no!。
...全文
1104 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
magicioney 2012-10-09
  • 打赏
  • 举报
回复
懂了!! 谢谢大神们回复~~
受用啊~~~
图灵狗 2012-10-09
  • 打赏
  • 举报
回复
向set中添加的元素类型必须重载<操作符用来排序。排序满足以下准则:
1、非对称,若A<B为真,则B<A为假。
2、可传递,若A<B,B<C,则A<C。
3、A<A永远为假。

set中判断元素是否相等:
if(!(A<B || B<A)),当A<B和B<A都为假时,它们相等。
zjwzcnjsy 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

set中相等定义为
a>b且b<a则a==b
所以程序输出no!是正确的

a>b且b<a则a==b
改为
a<b且b<a则a==b
[/Quote]
a<b为false且b<a为false
则a==b
zjwzcnjsy 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

set中相等定义为
a>b且b<a则a==b
所以程序输出no!是正确的
[/Quote]
a>b且b<a则a==b
改为
a<b且b<a则a==b
zjwzcnjsy 2012-10-09
  • 打赏
  • 举报
回复
set中相等定义为
a>b且b<a则a==b
所以程序输出no!是正确的
sublimepan 2012-10-09
  • 打赏
  • 举报
回复
set依靠的是比较操作(默认为 < )而不是相等操作。意味着元素的相等操作需要由不相等定义。
magicioney 2012-10-09
  • 打赏
  • 举报
回复
求大神啊 自己顶个
magicioney 2012-10-09
  • 打赏
  • 举报
回复
求大神啊 自己顶个
magicioney 2012-10-09
  • 打赏
  • 举报
回复
求救啊, 搞不明白 find函数 难道是根据 < 的重载来判定的?

64,662

社区成员

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

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