Chinaunix首页 | 论坛 | 博客
  • 博客访问: 474344
  • 博文数量: 120
  • 博客积分: 1853
  • 博客等级: 上尉
  • 技术积分: 1177
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-22 22:40
文章分类

全部博文(120)

文章存档

2013年(16)

2012年(104)

分类: C/C++

2013-04-10 01:41:02

c++中当定义了一个结构体,里面有若干个变量,如果放在一个set中,那么必须重载小于号,于是有了下面的重载函数

点击(此处)折叠或打开

  1. #include <vector>
  2. #include <algorithm>
  3. #include <string>
  4. #include <set>
  5. #include <stdexcept>
  6. #include <iostream>
  7. using namespace std;
  8. struct test
  9. {
  10.     string tt;
  11.     bool operator<(const test& a)
  12.     {
  13.         return (tt<a.tt);
  14.     }
  15. };
  16. int main()
  17. {
  18.     test tt;
  19.     test tt2;
  20.     tt.tt = "a";
  21.     tt2.tt="b";
  22.     set<test> se;
  23.     se.insert(tt);
  24.     se.insert(tt2);
  25.     cin.get();    
  26.     return 0;
  27. }

对于这种,我们如果直接比较两个test类型的对象的话,肯定没问题。但是如果是定一个set那么就会出一堆堆的各种错,
但问题出在哪里呢?
我们知道set中的类型都是const的,set是用红黑树做的,需要比较大小,会调用类的重载的小于号。问题就在与重载的小于号能不能被调用到。
而实际上const类型的对象只能调用const类型的函数,因此必须对重载的小于号是const类型的函数,在函数后加一个const即可。
下面的这个编译不会出错误,而且正常的比较也能产生正确的结果。

点击(此处)折叠或打开

  1. #include <string>
  2. #include <set>
  3. #include <iostream>
  4. using namespace std;
  5. struct test
  6. {
  7.     string tt;
  8.     bool operator<(const test& a)const
  9.     {
  10.         return (tt<a.tt);
  11.     }
  12. };
  13. int main()
  14. {
  15.     test tt;
  16.     test tt2;
  17.     tt.tt = "a";
  18.     tt2.tt="b";
  19.     if(tt<tt2)
  20.     {
  21.         cout<<"operator"<<endl;
  22.     }
  23.     set<test> se;
  24.     se.insert(tt);
  25.     se.insert(tt2);
  26.     cin.get();    
  27.     return 0;
  28. }

阅读(1626) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~