使用std sort需要注意的問題

2021-05-21 20:25:53 字數 926 閱讀 6207

在網上搜到一篇解決這個錯誤的有用的資料,特記錄。

1.例子

先舉個例子:分析一下程式的執行結果:看看在三種情況下程式的輸出分別是什麼,有可能出現異常

#pragma once

#include

#include

////// 下面是三個自定義的謂詞函式,排序演算法將分別使用這三個函式

//bool compare(int a,int b)

bool compare1(int a,int b)

bool compare2(int a,int b)

////main 函式

int main(int arg,char * argv)

//2.結果

三種情況在程式中分別使用後(這裡為了節省空間寫在了一起)的結果是:

(1)第一種情況(compare函式)和第三種情況(compare2 函式)出現錯誤(assert):

(2)第二種情況(compare1函式)下程式執行正常,結果正確。

3.分析

第一種情況和第三種情況出錯的原因是:跟蹤到出現異常的stl的源**的乙個函式中,就是下面這個函式:

templateinline

bool __clrcall_or_cdecl _debug_lt_pred(_pr _pred, _ty1& _left, _ty2& _right,

const wchar_t *_where, unsigned int _line)

這個函式要求對於呼叫的兩個引數交換位置時不能得到相同的true的結果。也就是為什麼第一種和第三種不行的原因了:a當待比較的兩個值相等的時候,第三種情況和b當待比較的兩個值不相等的時候,第一種情況。

但是對於呼叫的兩個引數交換位置時允許得到相同的false的結果,因為這時根本不進行兩個引數交換位置操作!!(具體看程式:在第乙個if的時候就返回false了)

使用std sort需要注意的問題

在網上搜到一篇解決這個錯誤的有用的資料,特記錄。1.例子 先舉個例子 分析一下程式的執行結果 看看在三種情況下程式的輸出分別是什麼,有可能出現異常 pragma once include include 下面是三個自定義的謂詞函式,排序演算法將分別使用這三個函式 bool compare int a...

使用iterat移除list需要注意的問題

迭代用完後在使用之前需要重新生成,指標變了 iteratorchannelcompositionsiterator compositions.iterator 兩次remove同一次的遍歷報錯 iterator是物件引用迭代器中的效果會反應到引用物件 iteratorchannelcompositi...

Object c block需要注意的幾點問題

摘自 date 2015 12 4 1.block定義 1 說明 a.block是oc中的一種資料型別,在ios開發中被廣泛使用 b.是block的特有標記 c.block的實現 包含在 之間 d.大多情況下,以內聯inline函式的方式被定義和使用 e.block與c語言的函式指標有些相似,但使用...