亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果比較功能不像運算符<那樣,為什么std :: sort會崩潰?

如果比較功能不像運算符<那樣,為什么std :: sort會崩潰?

鴻蒙傳說 2019-12-05 16:05:37
以下程序是使用VC ++ 2012編譯的。#include <algorithm>struct A{    A()        : a()    {}    bool operator <(const A& other) const    {        return a <= other.a;    }    int a;};int main(){    A coll[8];    std::sort(&coll[0], &coll[8]); // Crash!!!}如果我更改return a <= other.a;為,return a < other.a;則程序將正常運行,沒有例外。為什么?
查看完整描述

3 回答

?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

std::sort需要其滿足分揀機嚴格弱排序規則,這是解釋 在這里


因此,您的比較器說,a < b當a == b不遵循嚴格的弱排序規則時,該算法可能會崩潰,因為它將進入無限循環。


查看完整回答
反對 回復 2019-12-05
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

xorguy的答案非常好。


我只是從標準中添加一些報價:


25.4排序及相關操作[alg.sorting]


為了使25.4.3中描述的算法無法正常工作,comp必須在值上引入嚴格的弱排序。


術語“ 嚴格”是指對非自反關系的要求(!comp(x,x)對于所有x),而術語“ 弱于”的要求不如總訂購的要求強,但要強于部分訂購的要求。 。


所以xorguy很好地解釋了這一點:您的comp函數說,a < b當a == b哪個不遵循嚴格的弱排序規則時...


查看完整回答
反對 回復 2019-12-05
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

您必須詳細了解它要檢查的內容,但是標準的排序例程旨在非常非??斓剡\行,因此它們不必檢查您所做的任何事情就可以了,而只是依靠它。如果您的比較返回不可能的結果,那么將不可能發生的事情-說它得到了一些比較的結果,并將其用作查看位置的索引,只有它“知道”可能的值并“知道”結果引用將存儲在有效存儲中,因此只需將其提取即可。Kaboom:SIGSEGV運氣不錯。如果運氣不好,它將無聲地管理您的數據

查看完整回答
反對 回復 2019-12-05
  • 3 回答
  • 0 關注
  • 725 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號