C++ sort函数第三个参数的理解

 1.sort函数用法

C++reference中,最复杂的重载函数定义如下:
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

平时常用前两个参数,分别代表需要排序的起始位置和终止位置,第三个参数是排序的规则,可以省略,此时就是默认排序规则(从小到大排列)

comp函数可以自己编写,以适应不同的数据结构。比如要排列一个结构体,采用降序排列

#include <algorithm>
struct range
{
    int start;
    int end;
    range(): {start(0), end(0)}
    range(int a, int b): {start(a), end(b)}
};

bool comp(range a, range b)//比较函数的返回值一定是bool型,并且入口参数暂时到现在是两个,暂时没有更高的需要情景,以后可以补充
{
    return a.start>b.start;//想按什么情况来排序,就是这种情况下返回的值是true,但是这里面似乎不能用>=或者<=这样的符号
}


vector<range> r(10,a);
sort(r.begin(), r.end(), comp);
    

也可以使用C++库中已有的排序函数,在<functional>头文件中,有equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>,可以直接作为comp函数

sort(A,A+100,greater<int>());//降序排列
sort(A,A+100,less<int>());//升序排列

2.sort函数使用场合

不是所有的容器直接用sort函数的,有些容器自带有sort函数,不能使用sort(name.begin(), name.end(), comp),只要用name.sort(comp)即可,比如list容器。

3.sort函数使用类内类外的区别

上面介绍的一直是sort函数在类外的使用方法。当sort函数在类内使用,并且定义comp函数也是类成员函数时,必须要在comp函数前加static,因为sort需要传入的参数是一个普通函数指针,而不是成员函数指针,所以需要在类成员定义前加static。如下

class trans
{
private:
	struct coordinate
	{
		double x;
		double y;
		double z;
		double i;
		double j;
		double k;
		int id;
	};
	list<coordinate> point;
	int read_data(ifstream &ifs, list<coordinate> &point);
	static bool comp(coordinate a, coordinate b);//加static
	int sort_by_x(list<coordinate> &point);
	int write_data(ofstream &ofs, list<coordinate> point, CString CC_VC, int num);
public:
	int trans_style(CString inputpath, CString outputpath, CString CC_CV, int num);
};

注意:为什么定义comp函数也是类成员函数时,必须要在comp函数前加static

其实这并不是sort函数规定的,而是所有的的普通类成员函数,都不能以函数指针的方式作为其他函数的入口参数,因为普通成员函数在编译阶段,会自动添加了入口参数,这样这个函数指针的模板其实就改变了,比如举个例子:

class C
{
public:
    bool compare(int a, int b)
    {
        return a > b;
    }
    int test()
    {
        int a[10] = { 9, 6, 3, 8, 5, 2, 7, 4, 1, 0 };
        for (int i = 0; i < 10; i++)
            cout << a[i] << endl;
        sort(a, a + 10, compare);//在这里就不需要对compare函数传入参数了   
        for (int i = 0; i < 10; i++)
            cout << a[i] << endl;
        return 0;
    }
};


经过编译以后,cmp函数变为如下形式:

bool compare(C *this, int a, int b)


而sort应该接收这样bool compare(int a, int b)模板的函数指针,所以会编译报如下的错误:

第一个错误就是sort找不到接收bool compare(C *this, int a, int b)模板指针作为入口参数的函数模板

第二个错误就是不认为这边compare是函数入口参数,而认为是函数调用,所以缺少函数列表。

 

而静态成员函数是没有this指针的,所以可以使用。

这篇文章可以作为参考,原理是一样的:https://blog.csdn.net/this_capslock/article/details/17001003#commentBox

  • 32
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值