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

C++中sort()对pair类型vector按second值排序报错排查

错误原因

代码报错的核心原因是传给std::sort的比较器sec是类的非静态成员函数:

  • 非静态成员函数会隐式携带this指针作为第一个参数,实际函数签名和std::sort要求的「接收两个const pair<int,int>&参数、返回bool值」的可调用对象签名完全不匹配
  • 非静态成员函数必须依托类的实例才能调用,直接把函数名作为参数传给sort时,无法正确匹配调用规则,最终触发编译或运行错误。
  • 原代码缺失<iostream>、<vector>、<algorithm>必要头文件引用,也会触发编译报错。
修改方案

以下三种方案都可以正确实现按pair的second值升序排序的需求,按需选择即可:

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

静态成员函数没有隐式this参数,签名完全符合sort的比较器要求,对原代码改动最小:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Solution{
public:
// 加static修饰比较函数即可
static bool sec(const pair<int,int>&p1,const pair<int,int>&p2)
{
    return (p1.second<p2.second);
}   
void print(){
    vector<pair<int,int>>v={{1,5},{2,4},{4,3},{7,8}};
    sort(v.begin(),v.end(),sec);
    for(auto i:v)
    {
        cout<<i.first<<" "<<i.second;
        cout<<endl;
    }
}
};

方案2:使用C++11 lambda表达式作为比较器(推荐)

不需要额外定义类成员比较函数,逻辑直接内联在sort调用处,代码可读性更高,是目前工业界和算法题场景的主流写法:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Solution{
public:
void print(){
    vector<pair<int,int>>v={{1,5},{2,4},{4,3},{7,8}};
    // 直接传入lambda实现比较逻辑
    sort(v.begin(),v.end(),[](const pair<int,int>&p1,const pair<int,int>&p2){
        return p1.second < p2.second;
    });
    for(auto i:v)
    {
        cout<<i.first<<" "<<i.second;
        cout<<endl;
    }
}
};

方案3:将比较函数定义为类外的全局自由函数

全局函数没有隐式参数,也符合sort的比较器要求,适合比较逻辑需要在多个类中复用的场景:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 类外定义全局比较函数
bool sec(const pair<int,int>&p1,const pair<int,int>&p2)
{
    return (p1.second<p2.second);
}   

class Solution{
public:
void print(){
    vector<pair<int,int>>v={{1,5},{2,4},{4,3},{7,8}};
    sort(v.begin(),v.end(),sec);
    for(auto i:v)
    {
        cout<<i.first<<" "<<i.second;
        cout<<endl;
    }
}
};

以上代码运行后会按pair的second值升序输出结果:

4 3
2 4
1 5
7 8

内容的提问来源于stack exchange,提问作者akash aviraj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:06:33