日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL源码剖析——P142关于list::sort函数

發布時間:2025/3/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL源码剖析——P142关于list::sort函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在list容器中,由于容器自身組織數據的特殊性,所以list提供了自己的排序函數list::sort, 并且實現得相當巧妙,不過《STL源碼剖析》的原文中,我有些許疑問,對于該排序算法,侯認為是采用了快排,但是經過仔細分析,我認為是采用了歸并來實現的。

list::sort函數的實現位于stl_list.h文件,源碼及注釋如下:

template <class T, class Alloc> void list<T, Alloc>::sort() {

??? if (node->next == node || link_type(node->next)->next == node) return;

? ? list<T, Alloc> carry;

??? // 對于索引i的元素counter[i],存放的是節點數為2^i的list數據

? ? list<T, Alloc> counter[64];

? ? int fill = 0;

??? while (!empty()) {

??????? //每次循環,都從當前list中取出頭結點,接合到carry中去

??????? //即每次循環開始時,carry都只從當前list中取出一個結點(頭結點)

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

??????? int i = 0;

??????? while(i < fill && !counter[i].empty()) {

? ???????? //從索引0開始,將carry中的list結點歸并到counter[i]中去

? ???????? counter[i].merge(carry);

?? ??????? //執行交換操作,將歸并后的結果存入carry,交換前,carry為空,交換后counter[i]為空

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

?????? }

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

???????if (i == fill) ++fill;

???? ? //記錄counter中當前已經填充了數據的元素的最高索引

??? }

??? for (int i = 1; i < fill; ++i) counter[i].merge(counter[i-1]);

? ? //將counter中遺留的元素歸并 ? swap(counter[fill-1]);

? ? //將排序后的結果換入當前list所在的空間上

}

遺留問題:counter[64],為什么要用64?還未弄明白,留待弄明白后,再作記錄……

轉載于:https://www.cnblogs.com/crazyhf/archive/2012/12/17/2822129.html

總結

以上是生活随笔為你收集整理的STL源码剖析——P142关于list::sort函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。