C++ std::sort 意外行为(运行时错误)

Abh*_*wal 3 sorting algorithm runtime-error std c++11

谁能告诉我为什么 std::sort 显示这种意外的行为。

此代码给出运行时错误

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

inline bool compare(string a, string b){
    return a.size() <= b.size();
}

int main(){

        int n = 100;

        string a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

        vector<string>v;
        for(int i=0; i<n; i++){
            v.push_back(a);
        }

        sort(v.begin(), v.end(), compare);

}
Run Code Online (Sandbox Code Playgroud)

但是当我替换return a.size() <= b.size();为时return a.size() < b.size();,它工作得很好。

R S*_*ahu 6

比较函数不满足使用 排序对象的要求std::sort。将其更改为

inline bool compare(string a, string b){
    return a.size() < b.size(); // Not <= just <
}
Run Code Online (Sandbox Code Playgroud)

为什么使用不起作用<=

向量的所有元素都是大小相等的字符串。因此,我们的排序工作几乎与对数字列表进行排序相同。

给定两个数字,std::sort必须判断一个数字是否小于另一个、大于另一个,或者它们相等。

给定n1n2

  1. 如果comp(n1, n2)返回true,则n1小于n2
  2. 如果comp(n1, n2)返回falsecomp(n2, n1)返回false,则n1等于n2
  3. 如果comp(n1, n2)返回falsecomp(n2, n1)返回true,则n1大于n2

<=如果在比较函数中使用comp(n1, n2)returntrue comp(n2, n1)returns true。鉴于此,排序算法根本无法对对象进行排序,并且在尝试这样做时会进入无限递归。