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
相关产品推荐
相关产品推荐

