簡體   English   中英

c++ std::vector std::sort 無限循環

[英]c++ std::vector std::sort infinite loop

每當我嘗試對導致無限循環的對象向量進行排序時,我都會遇到一個問題。 我正在使用自定義比較 function,我傳入排序 function。

當兩個對象相等而不是 true 時,我可以通過返回 false 來解決此問題,但我並不完全理解解決方案。 我認為這是因為我的比較 function 違反了 cplusplus.com 上概述的這條規則:

比較 function object 取兩個與范圍內相同類型的值,如果第一個參數在其定義的特定嚴格弱排序中位於第二個參數之前,則返回 true,否則返回 false。

誰能提供更詳細的解釋?

如果您正在尋找“嚴格弱排序”的詳細解釋,這里有一些很好的閱讀材料:我說的命令!

如果您正在尋求修復比較函子的幫助,則需要實際發布它。

如果項目相同,則一個不在另一個之前 go。 該文檔非常清楚地說明在這種情況下您應該返回false

正如其他人指出的那樣,正確的答案是了解什么是“嚴格的弱排序”。 特別是,如果comp(x,y)為真,則comp(y,x)必須為假。 (請注意,這意味着comp(x,x)為假。)

這就是您糾正問題所需要知道的一切。 如果您的比較 function 違反規則,則sort算法根本不會做出任何承諾。

如果您好奇到底出了什么問題,您的庫的sort例程可能在內部使用了快速排序。 快速排序通過在序列中重復查找一對“亂序”元素並交換它們來工作。 如果您的比較告訴算法 a,b 是“亂序的”,並且它還告訴算法 b,a 是“亂序的”,那么算法最終可以永遠地來回交換它們。

實際規則在 C++ 標准中指定,在25.3[lib.alg.sorting]/2

比較用作 function object 如果第一個參數小於第二個參數,則返回true ,否則返回false

arguments 相等的情況屬於“否則”。

排序算法很容易循環,因為您說 A < B AND B < A 當它們相等時。 因此,該算法可能會無限嘗試交換元素 A 和 B,試圖讓它們以正確的順序排列。

嚴格的弱排序意味着 a < b == true 並且當您為相等返回 true 時,它的 a <= b == true。 不同排序算法的最優性需要此要求。

暫無
暫無

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

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