STL之list容器的實現框架

2021-09-09 02:34:51 字數 1967 閱讀 5833

list的底層採用資料結構是環形的雙向鍊錶。 相對於vector容器。list容器插入和刪除操作付出的代價要比vector容器小得多,可是list帶有鍊錶的天生弱點。就是不支援隨機訪問。

從內建的迭代器角度分析。vector容器相應的迭代器為隨機訪問迭代器,而list容器內建的迭代器則為雙向迭代器。

我們也知道,stl中提供的非常多演算法都是基於隨機訪問迭代器的,如sort(b,e)函式,其所使用的迭代器就是隨機訪問迭代器。所以。list不能使用這類演算法函式。為此。stl又在list容器中內建了其特有的演算法。這些演算法都是依據list容器的特點定身製造的。

所以,要設計乙個list容器,我們須要考慮這些問題:

(1)結點設計。學過資料結構的都知道。鍊錶就是將乙個乙個 的結點通過指標鏈結起來,結點是構成鍊錶的元素。所以首先得考慮雙鏈表結點的設計。相應的設計**框架例如以下:

/********底層結點的定義**********/

templatestruct _list_node

;

(2)迭代器的設計。因為list容器相應的迭代器是雙向迭代器,既然是雙向迭代器,我們就必須為該迭代器提供++、--操作。而又因為鍊錶並不一定是連續的空間分配,所以不能直接對原生的指標做++、--的操作。而應該利用迭代器對原生指標做封裝。然後對迭代器重載++、--的操作,當中迭代器的++相應原生指標的p=p->next,迭代器的--則相應原生指標的p=p->pre。

/*******list迭代器的定義**********/

templatestruct _list_iterator

//無參建構函式

_list_iterator(link_type p1):p(p1){};//單形參建構函式,引數為原生指標

_list_iterator(const iterator_type & iter):p(iter.p){};//複製建構函式

bool operator==(iterator_type& iter)const;//推斷兩個迭代器的原生指標是否相等,即this->p是否等於iter.p

bool operator!=(iterator_type& iter)const;//跟上相反

reference operator*()const;//解引用,返回p->data

pointer operator->()const;//箭頭操作符。返回&(p->data)

/******以下定義作為乙個雙向容器的應有操作********/

iterator_type operator++();//定義++前置操作,++iter

iterator_type operator++(int);//定義++後置操作,iter--

iterator_type operator--();//定義--前置操作,--iter

iterator_type operator--(int);//定義--後置操作,iter--

};

(3)list容器的設計。

list容器除了內部封裝乙個特殊的迭代器外,還須要提供一些特定演算法,由於list容器的物件非常多stl提供的演算法都不能使用。所以須要其自身提供封裝好對應的函式。

/***************list容器的定義*************************/

templateclass list

;

上面的**中,指的一提是sort函式。該sort函式採用的是歸併排序的非遞迴演算法,還有就是reverse函式。reverse函式的實現思路是將原煉表中的結點從頭到尾依次剪下到頭部,這樣就能夠將鍊錶逆轉。

參考文獻

[1]《c++primer 第4版》

[2]《stl源**剖析 侯捷》

STL通用容器之 list 容器

list容器 相對於vector的連續線性空間,list是乙個雙向鍊錶,它有乙個重要性質 插入操作和刪除操作都不會造成原有的list迭 器失效,每次插入或刪除乙個元素,就配置或釋放乙個元素空間。也就是說,對於任何位置的元素插入或刪除,list 遠是常數時間。1 建構函式 listc 建立乙個空的li...

教你使用STL容器之list

相較於vector的連續線性空間,list就稍微有點複雜,它的好處是每次插入或刪除乙個元素,就配置或釋放乙個元素空間。list對於空間的運用有絕對的精準,一點也不浪費,而且對於任何位置元素的插入和刪除,list時間複雜度為o 1 list底層是乙個帶頭結點的雙向迴圈鍊錶。list的插入和刪除操作都不...

STL序列式容器之list

一,list容器基本概念 1.list容器基本知識 二,list容器建構函式 1.無參建構函式 無參建構函式 list l1 2.有參建構函式 有參建構函式,10個字元 a 來初始化容器 list l2 10,a 有參建構函式,用上面的容器初始化下面的容器 list l3 l2.begin l2.e...