c++中当定义了一个结构体,里面有若干个变量,如果放在一个set中,那么必须重载小于号,于是有了下面的重载函数
-
#include <vector>
-
#include <algorithm>
-
#include <string>
-
#include <set>
-
#include <stdexcept>
-
#include <iostream>
-
using namespace std;
-
struct test
-
{
-
string tt;
-
bool operator<(const test& a)
-
{
-
return (tt<a.tt);
-
}
-
};
-
int main()
-
{
-
test tt;
-
test tt2;
-
tt.tt = "a";
-
tt2.tt="b";
-
set<test> se;
-
se.insert(tt);
-
se.insert(tt2);
-
cin.get();
-
return 0;
-
}
对于这种,我们如果直接比较两个test类型的对象的话,肯定没问题。但是如果是定一个set那么就会出一堆堆的各种错,
但问题出在哪里呢?
我们知道set中的类型都是const的,set是用红黑树做的,需要比较大小,会调用类的重载的小于号。问题就在与重载的小于号能不能被调用到。
而实际上const类型的对象只能调用const类型的函数,因此必须对重载的小于号是const类型的函数,在函数后加一个const即可。
下面的这个编译不会出错误,而且正常的比较也能产生正确的结果。
-
#include <string>
-
#include <set>
-
#include <iostream>
-
using namespace std;
-
struct test
-
{
-
string tt;
-
bool operator<(const test& a)const
-
{
-
return (tt<a.tt);
-
}
-
};
-
int main()
-
{
-
test tt;
-
test tt2;
-
tt.tt = "a";
-
tt2.tt="b";
-
if(tt<tt2)
-
{
-
cout<<"operator"<<endl;
-
}
-
set<test> se;
-
se.insert(tt);
-
se.insert(tt2);
-
cin.get();
-
return 0;
-
}
阅读(1662) | 评论(0) | 转发(0) |