sort()的疑问
我在使用sort()对一个类序列进行排序,如下程序:
#include <iostream>
#include <vector>
using namespace std;
class Test {
public:
int _i;
Test(int i) : _i(i) {};
bool operator < (const Test& i ) const { return _i < i._i;}
};
int main()
{
vector <Test> v;
for (int i=0; i <5; i++) {
Test t(i);
v.push_back(t);
}
sort(v.begin(),v.end());
for (vector <Test> ::const_iterator ci=v.begin(); ci!=v.end(); ci++)
cout < < ci-> _i < < endl;
return 0;
}
以上编译没有问题,但是如果:
bool operator < (const Test& i ) const { return _i < i._i;}
改为非常量引用,或者非常成员函数
bool operator < (Test& i ) { return _i < i._i;}
这样编译不能通过,我知道这种写法不好。但是我想了解一下这是sort函数的强制要求吗?还有哪些库函数有类似有问题?
请指教,谢谢。
编译器版本:
gcc version 3.4.5 20051201 (Red Hat 3.4.5-2)
[解决办法]
能用来排序的对象类型,要符合“Less Comparable Concept”,这个Concept要求
用 <比较的操作是一种const操作,这样,在常量之间或者const变量之间比较的结果与
普通的两个变量的比较结果相同,所以两个const关键字都是强制的--除非STL没有
满足设计要求
[解决办法]
关于这个强制要求的原因,学院式理论分析比较麻烦,简单地说,就是你要确保你的
比较操作不能改变参加比较的两个操作数的状态,否则,再次比较的结果,可能与之前的
比较结果不一致,这样会导致排序混乱--所以,不管左操作数*this,或者右操作数,
都得用const修饰,其中修饰*this的时候,实际上就是参数表后面那个const