【问题标题】:c++ std::sort unexpected behaviour (Runtime Error)c++ std::sort 意外行为(运行时错误)
【发布时间】:2018-11-11 21:23: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);

}

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

【问题讨论】:

  • 请添加您在使用return a.size() &lt;= b.size();时遇到的错误。您甚至可以通过搜索得到答案;)

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


【解决方案1】:

比较功能不满足使用std::sort对对象排序的要求。改成

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

为什么不能使用&lt;=

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

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

给定n1n2

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

如果你在比较函数中使用&lt;=comp(n1, n2) 返回true 并且 comp(n2, n1) 返回true。鉴于此,排序算法根本无法对您的对象进行排序,并在尝试这样做时进入无限递归。

【讨论】:

    【解决方案2】:

    std::sort 的典型实现使用了一些快速排序的变体,可能类似于 Hoare 分区方案,它从左侧扫描数组,只要值是 枢。该方案依赖于 value == pivot 来终止扫描。如果用户比较在相等的值上返回 true,则任一扫描都可能超出数组的边界,从而导致内存访问错误。

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

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      相关资源
      最近更新 更多