[英]C++ std::sort custom comparator runs indefinitely when the comparator returns true
因此,在使用自定義比較器對向量進行排序時,我在邊緣情況下遇到了這種非常奇怪的行為。
運行此代碼時,它不會停止,並且永遠運行:
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()
函數中的一些重要概念?
這個比較器:
auto comp = [](int lhs, int rhs) {
return true;
};
違反std::sort
的要求,即比較器必須建立嚴格弱排序。 請注意,無論參數的順序如何,此函數都返回true
,這意味着 2 個元素都可以小於另一個,這實際上沒有意義。 違反std::sort
這個要求會調用未定義的行為(這足以解釋您看到的不同vector
大小的不同行為)。
另一方面,這個比較器:
auto comp = [](int lhs, int rhs) {
return false;
};
完全沒問題。 它基本上是說沒有元素比其他元素少(即它們都是等價的)。 這滿足strict-weak-ordering ,因此std::sort
可以很好地使用它。
當然, std::sort
不會對第二個比較器做任何有用的事情,因為所有元素都已經“排序”了。 不過,這可能會重新排列元素; 但是如果你使用std::stable_sort
那么原始范圍保證不變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.