簡體   English   中英

C++ std::sort 自定義比較器在比較器返回 true 時無限期運行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM