【发布时间】:2021-01-11 17:40:04
【问题描述】:
因此,在使用自定义比较器对向量进行排序时,我在边缘情况下遇到了这种非常奇怪的行为。
运行此代码时,它不会停止,而是永远运行:
int main() {
auto comp = [](int lhs, int rhs) {
return true;
};
vector<int> vec{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
为什么会这样?我是否遗漏了 C++ 的 sort() 函数中的一些重要概念?
【问题讨论】:
-
你的比较器没有实现严格的弱排序 -> 未定义的行为
-
“如果长度超过 16,g++ 会切换到另一种排序算法吗?” 这是合法的,事实上,编译器倾向于使用混合算法来提高性能,保证复杂性.
标签: c++ sorting stl strict-weak-ordering