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

 1.sort函数用法

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

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

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

#include 
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 r(10,a);
sort(r.begin(), r.end(), comp);
    

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

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

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 point;
	int read_data(ifstream &ifs, list &point);
	static bool comp(coordinate a, coordinate b);//加static
	int sort_by_x(list &point);
	int write_data(ofstream &ofs, list 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

你可能感兴趣的:(C++ sort函数第三个参数的理解)