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

时间:2018-06-01 17:29:54

标签: algorithm sorting c++11 runtime-error std

任何人都可以告诉我为什么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);

}

但是当我用return a.size() <= b.size();替换return a.size() < b.size();时,它完全正常。

2 个答案:

答案 0 :(得分:4)

比较功能不符合使用std::sort订购对象的要求。将其更改为

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

为什么使用<=不起作用?

矢量的所有元素都是相同大小的字符串。因此,我们的排序几乎与排序数字列表相同。

给定两个数字,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
  4. 如果您在比较功能中使用<=comp(n1, n2)会返回true comp(n2, n1)会返回true。鉴于此,排序算法无法对您的对象进行排序,并在尝试这样做时进入无限递归。

答案 1 :(得分:2)

std :: sort的典型实现使用快速排序的一些变体,可能像分区方案一样,只要值<&lt;分区方案就从左侧扫描数组。只要值>&gt;,就可以从右侧进行旋转。枢。此方案依赖于值== pivot来终止扫描。如果用户比较在相等的值上返回true,则任一扫描都可能超出数组的范围,从而导致内存访问错误。

在调试版本中,可能会检查用户比较,如果它在相等的情况下返回true,则可能抛出异常而不是获取内存访问错误。