C++类中使用sort()时,自定义比较函数cmp为何需设为static?
为什么类中用于sort的自定义比较函数必须是static类型?
问题代码
class A{ public: // bool cmp(vector<int>& a,vector<int>& b){ // 编译失败 static bool cmp(vector<int>& a,vector<int>& b){ return a[0]<b[0]; } vector<vector<int>> merge(vector<vector<int>>& intervals) { sort(intervals.begin(),intervals.end(),cmp); /* 其他代码 */ } };
编译错误信息
error: reference to non-static member function must be called
sort(intervals.begin(),intervals.end(),cmp);
原因解析
非静态成员函数带隐藏的this指针
普通非静态成员函数的参数列表里,编译器会自动添加一个隐藏的this指针参数,用来指向调用该函数的类实例。而std::sort要求的比较函数只能接受两个待比较的元素作为参数,非静态成员函数的签名和sort的要求不匹配,因此编译报错。静态成员函数无this指针
静态成员函数属于类本身,不属于任何具体的类实例,它没有隐含的this参数,参数列表完全是你定义的两个vector<int>&,刚好符合sort对比较函数的签名要求,所以能正常传递使用。
其他替代方案
如果不想用静态成员函数,还有几种可选方式:
- 把
cmp定义为类外部的普通全局函数 - 在
merge函数内使用lambda表达式直接传递:sort(intervals.begin(), intervals.end(), [](vector<int>& a, vector<int>& b) { return a[0] < b[0]; });
内容的提问来源于stack exchange,提问作者wdd
相关产品推荐
相关产品推荐

