任何人都可以告诉我为什么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();
时,它完全正常。
答案 0 :(得分:4)
比较功能不符合使用std::sort
订购对象的要求。将其更改为
inline bool compare(string a, string b){
return a.size() < b.size(); // Not <= just <
}
为什么使用<=
不起作用?
矢量的所有元素都是相同大小的字符串。因此,我们的排序几乎与排序数字列表相同。
给定两个数字,std::sort
必须计算一个是否小于另一个,大于另一个,或者它们是相等的。
给定n1
和n2
,
comp(n1, n2)
返回true
,则n1
小于n2
。comp(n1, n2)
返回false
而comp(n2, n1)
返回false
,则n1
等于n2
。comp(n1, n2)
返回false
而comp(n2, n1)
返回true
,则n1
大于n2
。如果您在比较功能中使用<=
,comp(n1, n2)
会返回true
, comp(n2, n1)
会返回true
。鉴于此,排序算法无法对您的对象进行排序,并在尝试这样做时进入无限递归。
答案 1 :(得分:2)
std :: sort的典型实现使用快速排序的一些变体,可能像分区方案一样,只要值<&lt;分区方案就从左侧扫描数组。只要值>&gt;,就可以从右侧进行旋转。枢。此方案依赖于值== pivot来终止扫描。如果用户比较在相等的值上返回true,则任一扫描都可能超出数组的范围,从而导致内存访问错误。
在调试版本中,可能会检查用户比较,如果它在相等的情况下返回true,则可能抛出异常而不是获取内存访问错误。