stl中list的sort 函式解析

2021-08-18 09:22:52 字數 1930 閱讀 7868

list不能使用stl演算法sort(),必須使用自己的sort()member function,因為stl演算法sort()只接受randomaccessiterator,而list提供的是

bidirectional iterators

演算法描述:

templatevoid list::sort() 

templatetemplatevoid list::sort(compare comp)

carry.swap(counter[i]);

if (i == fill)

++fill;

} for (int i = 0; i != fill; ++i)

swap(counter[fill - 1]);

}}

步驟一:

list carry;

list counter[64];

這是一些空鍊錶,用於輔助操作

*this是待排序的list

步驟二:

carry.splice(carry.begin(),*this,begin());

每次都是將*this鍊錶中的首元素移入空鍊錶carry中,並在*this中刪除移走的元素

步驟三:

現在i=fill=0,不滿足while (i < fill && !counter[i].empty())

執行carry.swap(counter[0]);

然後將fill置為1

這樣一次while(!empty())執行完畢,開始下一輪

步驟一:

carry.splice(carry.begin(),*this,begin());

同上,將*this中的首元素拼接到carry中

步驟二:

counter[0].merge(carry,comp);

此時,進入內層while迴圈,將鍊錶carry中的元素合併(按comp方式進行合併,比如

carry.swap(counter[i++]);

將鍊錶carry與counter[0]進行交換

步驟三:

現在i=fill=1,不滿足while (i < fill && !counter[i].empty())

執行carry.swap(counter[1]);

然後將fill置為2

最後對3的處理也是同理

總之,每次執行完一次while,鍊錶carry總是為空鍊錶,而鍊錶counter[i]中存放目前sort好的元素,鍊錶list[i-1]...list[0]為空鍊錶。直到最後把所有元素都按照comp方式排好序

最後,swap(counter[fill-1]);

也就是把排好序的所有元素再換回*this中

STL中關於list容器的sort函式詳解

因為在stl中stl algo中提供有sort函式,他的函式原型 template inline void sort randomaccessiterator first,randomaccessiterator last template inline void sort randomaccess...

stl中list的sort演算法實現

stl中有乙個std sort演算法,但它是不支援std list的,因為list不提供randomiterator的支援,但list自己提供了sort演算法,把list的元素按從小到大的方式來排序,長度到不長,但真是難以讀懂,後來扣持了一下午終於搞明白了,貼個總結上來。list sort的 如下 ...

STL中的sort函式

b站二面時,面試官問了乙個問題,沒打出來感覺挺虧的。問題是 stl中的sort函式用的什麼排序演算法?這個問題我之前看面經的時候,看了一眼,但是當時沒有仔細研究過。大致知道裡面用了快速排序。stl的sort 演算法,資料量大時採用quick sort,分段遞迴排序。一旦分段後的資料量小於某個閾值,為...