首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

sort()的疑问,该如何处理

2012-02-28 
sort()的疑问我在使用sort()对一个类序列进行排序,如下程序:#includeiostream#includevectorusingname

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

热点排行