为何std::stable_sort()的比较器函数参数必须设为常量?
关于std::stable_sort比较器参数必须为const的问题解答
嗨,我来帮你搞清楚这个编译错误的原因和解决办法!
为什么会出现这个错误?
C的标准库排序算法(包括std::stable_sort)在内部处理元素时,会以const的方式传递元素给比较器。而你的compare函数参数是普通的非const引用string &s1,这就触发了C的核心规则:不能将const类型的对象绑定到非const引用上——因为非const引用允许修改引用的对象,这会破坏const对象的不可修改性,所以编译器直接报错阻止了这种行为。
你看到的错误信息里的“discards qualifiers”就是在明确提示这个问题:试图丢弃const限定符,把const字符串绑定到非const引用上。
如何解决?
有两种可行的修改方式,更推荐第一种:
方式1:将比较器参数改为const引用
把compare函数的参数改成const string &,这样既可以接收const对象,还能避免不必要的字符串拷贝,效率更高:
#include <iostream> #include <algorithm> #include <vector> using namespace std; void display(vector<string> &a); bool compare(const string &s1, const string &s2); int main() { vector<string> a = {"abc", "defgh", "ijk"}; std::stable_sort(a.begin(), a.end(), compare); display(a); return 0; } // 修改为const引用参数 bool compare(const string &s1, const string &s2) { return s1.length() < s2.length(); } void display(vector<string> &a) { for(int i=0; i<=a.size()-1; i++) { cout << a[i] << " "; } cout << "\n"; return ; }
方式2:传值(不推荐)
如果把参数改成直接传值string s1,虽然也能编译通过,但每次调用比较器都会拷贝字符串,对于大量数据来说效率很低,所以不建议这么做:
bool compare(string s1, string s2) { return s1.length() < s2.length(); }
额外提示
其实不只是std::stable_sort,C++标准库中大多数涉及比较的算法(比如std::sort、std::find_if等)都要求比较器能够处理const元素,所以把比较器的参数设为const引用是一个通用的良好编程习惯,能避免很多类似的编译问题。
内容的提问来源于stack exchange,提问作者Sahil Kohli
相关产品推荐
相关产品推荐

