signed

QiShunwang

“诚信为本、客户至上”

C++:sort函数,自定义排序报错

2021/6/3 17:06:05   来源:

sort函数

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

1.类内定义Compare comp:

class Test{
public:
    void test(){
        vector<int> v = {2,1,4,3,5,6,8,3,2};
        sort(v.begin(), v.end(), comp);
        for(int a : v)
            cout<<a<<" ";
    }
private:
	bool comp(int a, int b){
        return a > b;
    }
};

会报错:

error: must use '.*' or '->*' to call pointer-to-member function in '((__gnu_cxx::__ops::_Iter_comp_val<bool (Test::*)(int, int)>*)this)->__gnu_cxx::__ops::_Iter_comp_val<bool (Test::*)(int, int)>::_M_comp (...)', e.g. '(... ->* ((__gnu_cxx::__ops::_Iter_comp_val<bool 
(Test::*)(int, int)>*)this)->__gnu_cxx::__ops::_Iter_comp_val<bool (Test::*)(int, int)>::_M_comp) (...)'
  { return bool(_M_comp(*__it, __val)); 

是因为成员函数都有一个默认参数:this指针,也就是说我们写的comp成员函数其实有三个参数:

bool comp(const *this, int a, int b)

在comp前加static,静态成员函数没有this指针,因为静态成员函数不属于任何一个对象。

static bool comp(int a, int b){
	return a > b;
}

2.sort调用全局comp函数

bool comp1(int a, int b){
    return a > b;
}
class Test{
public:
    void test(){
        vector<int> v = {2,1,4,3,5,6,8,3,2};
        sort(v.begin(), v.end(), comp1);
        for(int a : v)
            cout<<a<<" ";
    }
};

3.使用C++的lambda表达式


class Test{
public:
    void test(){
        vector<int> v = {2,1,4,3,5,6,8,3,2};
        sort(v.begin(), v.end(), [](int a, int b)->bool{
        	return a > b;	
        });
        for(int a : v)
            cout<<a<<" ";
    }
};

Lambda 表达式的基本语法如下:

[ caputrue ] ( params ) opt -> ret { body; };

1.capture是捕获列表;
2.params是参数表;(选填)
3.opt是函数选项;可以填mutable,exception,attribute(选填)
mutable说明lambda表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获的对象的non-const方法。
exception说明lambda表达式是否抛出异常以及何种异常。
attribute用来声明属性。
4.ret是返回值类型(拖尾返回类型)。(选填)
5.body是函数体。