VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 606|回复: 2

sort()的疑问

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-31 17:40:01 | 显示全部楼层 |阅读模式
我在使用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)
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-3-11 16:30:02 | 显示全部楼层
能用来排序的对象类型,要符合“Less Comparable Concept”,这个Concept要求
用<比较的操作是一种const操作,这样,在常量之间或者const变量之间比较的结果与
普通的两个变量的比较结果相同,所以两个const关键字都是强制的--除非STL没有
满足设计要求
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-3-11 20:30:01 | 显示全部楼层
关于这个强制要求的原因,学院式理论分析比较麻烦,简单地说,就是你要确保你的
比较操作不能改变参加比较的两个操作数的状态,否则,再次比较的结果,可能与之前的
比较结果不一致,这样会导致排序混乱--所以,不管左操作数*this,或者右操作数,
都得用const修饰,其中修饰*this的时候,实际上就是参数表后面那个const
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表