You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:58:11