在 WIN32,Visual Studio 2022 上。當我定義一個vector<int>包含一百個 0 并使用下面的代碼對其進行排序時,拋出例外“無效比較器”。
vector<int> v(100, 0);
sort(v.begin(), v.end(), [](const int& a, const int& b)
{
return a >= b;
});
但是,如果我使用return a > b,它將執行得很好。這是為什么?
uj5u.com熱心網友回復:
這就是它的作業方式。你需要嚴格的弱排序。
對于基本原理,我認為充分的解釋是,這使您能夠確定這些元素是否相等(對例如std::sets 有用)。。<=或者>=不能那樣做
<=或者>=也可以這樣做,但似乎只是決定使用它<而不是任何其他關系。考慮到這一決定,標準庫設施被實施并且他們嚴重依賴它。
uj5u.com熱心網友回復:
問題是您提供的比較器(又名比較函式)沒有實作嚴格弱排序,因此它違反了std::sort導致未定義行為的先決條件。
來自std::sort:
comp - 比較函式物件(即滿足 Compare 要求的物件),如果第一個引數小于(即排在前面)第二個引數,則回傳真。
從比較:
應用于滿足比較型別的物件的函式呼叫操作的回傳值,當背景關系轉換為 bool 時,如果呼叫的第一個引數出現在此型別引起的嚴格弱排序關系中的第二個之前,則回傳 true,否則回傳 false除此以外。
這基本上意味著Compare我們提供的比較器函式不應該true為這兩個運算式求值:Compare(x, y)以及Compare(y, x)wherex和y是一些引數。否則,比較器不服從嚴格弱排序。
要解決此問題,您應該將 替換>=為>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/464678.html
