在網路上看到這個問題, 其實很有趣, 要仔細檢查才會發現問題, 我把它簡化成近似的版本如下:
using namespace std;
#include <vector>
#include <algorithm>
static bool comp(const int &a, const int &b)
{
return a >= b;
}
vector<int> nums = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int main()
{
sort(nums.begin(), nums.end(), comp);
return 0;
}
執行以上的程式, 可能會因為無窮迴圈或是耗盡系統資源被強制結束。主要就是因為傳給 std::sort
的 comp
參數是 Compare
型別, 必須滿足嚴格的弱排序關係, 也就是:
-
comp(a, a)
一定是false
。 - 若
comp(a, b)
為true
, 那comp(b, a)
就一定是false
。 - 若
comp(a, b)
是true
, 且comp(b, c)
也是true
, 那comp(a, c)
就一定是true
。
意義上就是在你期望的排列順序上 如果 a
絕對是排在 b
前面, 那 comp(a, b)
就是 true
。std::sort
是基於以上的規則設計的, 如果傳入的 comp
不符合以上規則, 就可能會導致本來把兩個項目對調順序, 之後卻又對調回來, 一直調來調去使得 std::sort
陷入無窮迴圈無法結束。只要滿足上述嚴格的弱排序關係, 就只會在有明確前後順序的情況下調動項目位置, 避免無窮無盡地調整順序了。
剛剛看到的範例就是這樣的情況。由於是以 a >= b
為比較結果, 所以並不符合上述 1,2 項的條件, 只要改用 a > b
或是 a < b
即可。
Top comments (0)