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...