如何解决当比较器返回true时,C ++ std :: sort自定义比较器将无限期运行
因此,在使用自定义比较器对向量进行排序时,我在边缘情况下遇到了这种非常奇怪的行为。
运行此代码时,它不会停止,并且永远消失:
int main() {
auto comp = [](int lhs,int rhs) {
return true;
};
vector<int> vec{0,0};
sort(vec.begin(),vec.end(),comp);
for (int num : vec)
cout << num;
return 0;
}
但是,当我将true
更改为false
时,它可以正常工作。
auto comp = [](int lhs,int rhs) {
return false;
};
奇怪的是,当我减少要排序的0
的数量时,它也可以正常工作。 (它适用于16个或更少的0
,当我再添加一个0
使其为17时,程序将不会再次停止。(如果长度超过16,g ++将切换到另一种排序算法?)
vector<int> vec{0,0};
为什么会这样?我是否缺少C ++的sort()
函数中的一些重要概念?
解决方法
此比较器:
auto comp = [](int lhs,int rhs) {
return true;
};
违反了std::sort
的要求,比较器必须建立严格弱排序。请注意,此函数将返回true
而不管参数的顺序如何,这意味着2个元素都可以小于另一个元素,这实际上没有任何意义。违反std::sort
的这一要求会调用未定义的行为(这足以解释您使用不同的vector
大小看到的不同行为)。
另一方面,这个比较器:
auto comp = [](int lhs,int rhs) {
return false;
};
很好。它基本上说没有元素比其他元素少(即它们都是等效的)。这满足了严格弱排序,因此std::sort
可以很好地工作。
当然,std::sort
对于第二个比较器不会做任何有用的事情,因为所有元素都已经“排序”了。但这可能会重新排列元素;但是如果您使用std::stable_sort
,那么原始范围肯定会保持不变。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。