STL sort的危險之處

2021-09-08 00:01:39 字數 730 閱讀 3936

stl好用是好用, 不慎的話相當危險, 尤其是俺們這些伺服器程式. 

迭代器失效就不說了, 發生了就是個當機回檔的事, 慎之!

最近工作中看到了stl::sort排序導致的乙個core, 問題的根源就是, stl::sort要求被排序的物件必須是順序確定的, 比如你在過載《操作符的時候

class test1 

};

上面的**就是沒問題的, 因為兩個給定的test1物件, 呼叫《的時候的結果是一致的.但是如果是下面這樣

class test2 

};

那麼, 對於obj1(a = 1, b = 4)和obj2(a = 2, b = 3)來說, obj1 < obj2的結果是真, 而obj2 < obj1的結果也是真, 這樣, stl::sort就會出錯。

又或者是:

class test2 

};

當排序的序列中,如果有兩個test類的a一樣大,就會出錯。

主要的原因是在stl::sort的內部, 由於這種無法判斷兩個元素大小的問題, 導致迭代器失效. 這次不是因為使用者erase讓其失效的, 而是因為沒有遵守stl::sort的前置條件, 而導致的內部迭代器失效, 比平常發生的失效更加的隱藏. 

可能看到這個錯誤會覺得怎麼可能寫出這種邏輯呢, 但是有時候在實現業務邏輯的時候, 就是很難發現這樣的和程式內建必要條件相矛盾的地方, 從而產生錯誤.

參考:

STL sort函式的用法

sort在stl庫中是排序函式,有時冒泡 選擇等o n 2 演算法會超時時,我們可以使用stl中的快速排序o n log n 完成排序 sort在庫裡面,原型如下 template void sort randomaccessiterator first,randomaccessiterator l...

STL sort函式的內部實現

1 在stl提供的各式各樣的演算法中,sort 是最複雜最龐大的乙個。這個演算法只接受randomaccessiterators 隨機訪問迭代器 然後將區間內所有元素由小到大重新排列。第二個版本允許使用者自己指定乙個仿函式作為排序標準。2 對於關係型容器,底層自己採用有自動排序功能的rb tree,...

STL sort演算法中的比較函式

排序,既陌生又熟悉的名詞。排序,成為面試官中喜歡問的演算法問題。c stl中為我們提供了std sort,所以今天我們不是來描述各種排序演算法的實現,而是看看怎麼使用stl為我們提供的sort。先預熱,include include include int main person int age,s...