关于类中重载sort函数的报错问题(解决error: invalid use of non-static member function 'bool Solution::cmp(int, int)')

刷LeetCode时,在solution类里用sort重载cmp函数会遇到问题。文章介绍三种解决方法:静态成员函数、lambda和内联函数。前两种因需使用外部Hash数组而失效,内联函数可解决。原因是普通成员函数有隐含this指针致参数不匹配。总结给出不同场景适用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刷LeetCode的时候,由于最终结果是要写一个solution的类,但是比较头疼的是sort似乎不可以写一个cmp函数来重载。

例如

class Solution {
public:
    int Hash[1005];
    bool cmp(int a, int b){
        return Hash[a] != Hash[b] ? Hash[a] < Hash[b] : a < b;
    }
    vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
        for(int i = 0; i < 1005; ++ i)
            Hash[i] = 2000;
        for(int i = 0; i < arr2.size(); ++ i)
            Hash[arr2[i]] = i;
        vector<int>arr = arr1;
        sort(arr.begin(), arr.end(), cmp);
        return arr;
    }

};

就会给出以下的报错

error: invalid use of non-static member function 'bool Solution::cmp(int, int)'

有两种解决方法:

方法一:静态成员函数

在cmp前面加上一个static定义即可。

本次由于cmp函数需要使用外部的Hash数组,此方法失效。

static bool cmp(int a, int b){
        return Hash[a] != Hash[b] ? Hash[a] < Hash[b] : a < b;
    }

引发报错

invalid use of member 'Solution::Hash' in static member function

方法二:lambda

本方法相当于方法一的简写,即直接用以下格式,在调用sort的时候,直接给出比较函数

sort(v.begin(), v.end(), [](int a, int b){return a < b};);

这种方法也是我比较喜欢的一种方法,同样本次由于cmp函数需要使用外部的Hash数组,此方法失效。

sort(arr.begin(), arr.end(), [](int a, int b){Hash[a] != Hash[b] ? Hash[a] < Hash[b] : a < b};);

引发下面的报错:

error: 'this' was not captured for this lambda function

方法三:内联函数

将比较函数cmp放到类的外面,加上inline声明,此时可以在sort中调用。

修改后代码AC:

int Hash[1005];
inline bool cmp(int a, int b){
    return Hash[a] != Hash[b] ? Hash[a] < Hash[b] : a < b;
}
class Solution {
public:
    vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
        for(int i = 0; i < 1005; ++ i)
            Hash[i] = 2000;
        for(int i = 0; i < arr2.size(); ++ i)
            Hash[arr2[i]] = i;
        vector<int>arr = arr1;
        sort(arr.begin(), arr.end(), cmp);
        return arr;
    }
};

原因

简单来讲,就是函数参数不匹配的问题。因为我们普通的成员函数都有一个隐含的this指针。

bool cmp( Solution* this, const Interval &a,const Interval &b );

实际上cmp函数有三个参数,而我们调用sort()排序函数的时候只需要用到两个参数进行比较,所以就出现了形参与实参不匹配的情况(函数有三个形参,但是只输入了两个实参)。

总结:

总的来讲,最简单的处理方法就是在cmp前加上static,可以解决绝大多数的重载问题。碰到需要利用其它外部的东西来辅助比较的时候,就用方法三。平时也可以用方法二lambda来精简自己的代码。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值