在網上搜到一篇解決這個錯誤的有用的資料,特記錄。
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語言的函式指標有些相似,但使用...