sort函數(shù)奇遇記_記一次C++使用sort函數(shù)遇到的問題

sort函數(shù)奇遇記

1.問題簡述

??最近在用C++的sort函數(shù)排序vector元素時,遇到一個錯誤养匈,特地在此記錄一下秋度。我將當(dāng)時出錯的代碼抽象一下,類似于下面這種形式惯疙。

int main() {
    vector<int> nums = { 5,8,5,6,4,7,56,8 };
    sort(nums.begin(), nums.end(), [](int a, int b) {
        return a <= b; });
    return 0;
}

??這段代碼看似沒任何問題翠勉,但是會遭遇到嚴(yán)重的運行時錯誤,通過測試發(fā)現(xiàn)霉颠,只有當(dāng)比較函數(shù)為<=对碌,且nums數(shù)組中存在重復(fù)元素時才會錯誤。而修改也比較簡單蒿偎,將lambda函數(shù)里面的<= 改為 < 即可朽们。

2.問題剖析

??為了進(jìn)一步弄清楚產(chǎn)生這個現(xiàn)象的原因,我查看了Cplusplus
上sort函數(shù)中comp參數(shù)的介紹诉位,如下所示:

Binary function that accepts two elements in the range as arguments, and returns a value convertible to . The value returned indicates whether the element passed as first argument is considered to go before the second in the specific strict weak ordering it defines.

??由其定義可知comp參數(shù)必須基于一種定義的嚴(yán)格弱序來判斷第一個參數(shù)是否在第二個參數(shù)之前骑脱。那么什么是嚴(yán)格弱序呢?其實嚴(yán)格弱序就是兩個的對象(比如a和b)的一種關(guān)系苍糠,該關(guān)系必須滿足以下特性(我們定義嚴(yán)格弱序關(guān)系的符號為\theta叁丧,例如 a \ \theta \ b,即為a嚴(yán)格弱序于b):

  1. 互斥性椿息,如果 a \ \theta \ b歹袁,那么 b \ \theta \ a一定為假;
  2. 傳遞性寝优,如果 a \ \theta \ b条舔,b\ \theta\ c,那么一定有a \ \theta \ c;
  3. 如果 a \ \theta \ b乏矾,b\ \theta\ a都不成立孟抗,那么 a 一定等于 b;

??其實钻心,這里我們也能猜出凄硼,sort函數(shù)的comp參數(shù),其實是定義一個判斷參數(shù)a和參數(shù)b是否嚴(yán)格弱序的布爾函數(shù)捷沸,如果是嚴(yán)格弱序則返回true摊沉,否則返回false;
??回到我們那段出錯的代碼痒给,我們可以看一下lambda函數(shù)是否符號嚴(yán)格弱序的定義说墨。我們可以發(fā)現(xiàn)骏全,當(dāng)a==b時,a<=b 和 b<= a都成立尼斧,即a \ \theta \ b姜贡,b\ \theta\ a同時成立,這違反了互斥性原則棺棵,因此函數(shù)會參數(shù)運行時錯誤楼咳。弄清楚了原因,修改起來也十分簡單烛恤,而且以后在寫相關(guān)的sort函數(shù)的comp參數(shù)時一定要注意這一點母怜。

3.總結(jié)
  1. 有時候用了很久沒出問題的函數(shù),不一定代表你真的熟悉了他棒动,其實你有可能還是理解錯了糙申,只是并沒有遇到能讓你出錯的應(yīng)用場景,而一旦出錯后果將不堪設(shè)想船惨。每一次看似成功的運行柜裸,都加強(qiáng)了自己對其盲目的自信,進(jìn)而加大了以后遇到意外狀況的debug難度和隱患粱锐。
  2. (https://www.cplusplus.com)是一個寶庫疙挺。
4.參考
  1. sort - C++ Reference (cplusplus.com)
  2. C++ 嚴(yán)格弱序_River_Lethe的博客-CSDN博客
  3. C++ stl 的sort使用中的坑_孫新的鐵匠鋪-CSDN博客
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怜浅,隨后出現(xiàn)的幾起案子铐然,更是在濱河造成了極大的恐慌,老刑警劉巖恶座,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搀暑,死亡現(xiàn)場離奇詭異,居然都是意外死亡跨琳,警方通過查閱死者的電腦和手機(jī)自点,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脉让,“玉大人桂敛,你說我怎么就攤上這事〗η保” “怎么了术唬?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滚澜。 經(jīng)常有香客問我粗仓,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任借浊,我火速辦了婚禮眶掌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巴碗。我一直安慰自己,他們只是感情好即寒,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布橡淆。 她就那樣靜靜地躺著,像睡著了一般母赵。 火紅的嫁衣襯著肌膚如雪逸爵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天凹嘲,我揣著相機(jī)與錄音师倔,去河邊找鬼。 笑死周蹭,一個胖子當(dāng)著我的面吹牛趋艘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凶朗,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼瓷胧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棚愤?” 一聲冷哼從身側(cè)響起搓萧,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宛畦,沒想到半個月后瘸洛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡次和,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年反肋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斯够。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡囚玫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出读规,到底是詐尸還是另有隱情抓督,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布束亏,位于F島的核電站铃在,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜定铜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一阳液、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揣炕,春花似錦帘皿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丁恭,卻和暖如春曹动,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牲览。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工墓陈, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人第献。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓贡必,卻偏偏與公主長得像,于是被迫代替她去往敵國和親痊硕。 傳聞我的和親對象是個殘疾皇子赊级,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容