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

C++ sort排序pair向量时提示非静态成员函数无效使用 如何解决?

错误原因

C++类的非静态成员函数会隐含一个this指针作为入参,你定义的sortbysec成员函数表面上只有两个入参,实际运行时需要传入当前类实例的地址作为隐藏的第一个参数。而标准库的sort函数要求传入的比较可调用对象必须严格接收两个参数用于比较元素,参数数量不匹配,因此编译器抛出该错误。

修复方案

有两种常用的修复方式:

方案1:将比较函数声明为静态成员函数

给sortbysec函数添加static关键字,静态成员函数不会携带隐含的this指针,参数数量符合sort的要求。
修改后完整代码:

class Solution
{
    public:
    //Function to find the maximum number of activities that can
    //be performed by a single person.

    // 加static关键字修饰
    static bool sortbysec(const pair<int ,int> &a, const pair<int,int> &b){
        return (a.second < b.second);
    }
    int activitySelection(vector<int> start, vector<int> end, int n)
    {
        int ans = 1;
        vector< pair<int,int> > v;
        for(int i=0;i<n;i++){
            v.push_back(make_pair(start[i],end[i]));
        }
        sort(v.begin(),v.end(),sortbysec);
        for(int i=1;i<n;i++){
            if(v[i].first >= v[i-1].second)
                ans++;
        }
        return ans;
    }
};

方案2:直接使用Lambda表达式作为比较参数

不需要单独定义sortbysec函数,直接在sort调用时传入匿名Lambda表达式,代码更简洁,修改后可以删除单独定义的sortbysec成员函数:
修改后完整代码:

class Solution
{
    public:
    //Function to find the maximum number of activities that can
    //be performed by a single person.
    int activitySelection(vector<int> start, vector<int> end, int n)
    {
        int ans = 1;
        vector< pair<int,int> > v;
        for(int i=0;i<n;i++){
            v.push_back(make_pair(start[i],end[i]));
        }
        // 直接传入lambda作为比较函数
        sort(v.begin(), v.end(), [](const pair<int,int> &a, const pair<int,int> &b) {
            return a.second < b.second;
        });
        for(int i=1;i<n;i++){
            if(v[i].first >= v[i-1].second)
                ans++;
        }
        return ans;
    }
};

内容的提问来源于stack exchange,提问作者Devendra Yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:06:01