[英]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
不應該對以下兩個表達式求值為true
: Compare(x, y)
和Compare(y, x)
,其中x
和y
是一些參數。 否則,比較器不服從嚴格的弱排序。
要解決此問題,您應該將>=
替換為>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.