簡體   English   中英

為什么 std::sort 在比較函數使用大於 (>) 而不是大於或等於 (>=) 時起作用?

[英]Why does std::sort work when the comparison function uses greater-than (>), but not greater-than-or-equal (>=)?

在 WIN32、Visual Studio 2022 上。當我定義一個包含一百個 0 的vector<int>並使用下面的代碼對其進行排序時,會拋出異常“無效比較器”。

vector<int> v(100, 0);
sort(v.begin(), v.end(), [](const int& a, const int& b)
    {
        return a >= b;
    });

但是,如果我使用return a > b ,它會執行得很好。 這是為什么?

這正是它需要的工作方式 您需要嚴格的弱排序

對於基本原理,我認為充分的解釋是這使您能夠確定這些元素是否相等(例如對std::set有用)。 <=>=不能那樣做

<=>=也可以做到這一點,但似乎只是決定使用<而不是任何其他關系。 考慮到這一決定,標准圖書館設施得以實施,他們嚴重依賴它

問題是您提供的比較器(又名比較函數)沒有實現嚴格的弱排序,因此它違反了導致未定義行為std::sort的先決條件。

來自std::sort

comp - 比較函數對象(即滿足 Compare 要求的對象),如果第一個參數小於(即排在第二個之前)則返回 true。

比較

應用於滿足 Compare 類型的對象的函數調用操作的返回值,當上下文轉換為 bool 時,如果調用的第一個參數出現在由該類型引起的嚴格弱排序關系中的第二個參數之前,則返回 true,否則返回 false除此以外。

這基本上意味着我們提供的比較器函數Compare不應該對以下兩個表達式求值為trueCompare(x, y)Compare(y, x) ,其中xy是一些參數。 否則,比較器不服從嚴格的弱排序。

要解決此問題,您應該將>=替換為>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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