C STL學習之四 容器list深入學習

2021-06-05 18:44:20 字數 2816 閱讀 4610

一、list基礎

list使用乙個雙向鍊錶來管理元素。圖一顯示了list的結構。

圖一 list的結構

任何型別只要具備賦值和可拷貝兩種性質,就可以作為list的元素。

二、list的功能

list的內部結構和vector和deque截然不同,在很多方面都表現不同:

1、list不支援隨機訪問。所及既不提供下表操作符,也不提供at()函式。

2、任何位置上插入元素刪除元素都很快。

3、插入和刪除操作不會造成指向其他元素的pointers、references、iterators失效。

4、list對於異常的處理方式是:要麼成功,要麼什麼都不發生。

5、不提供容量、空間重新分配等操作函式。

6、提供了一些函式專門用於移動元素。

三、list的操作函式

生成、賦值和銷毀與序列式容器相同。

建構函式和析構函式:

非變動性操作

賦值

元素訪問

一般來說,這些操作不會檢查元素是否為空,所以程式設計師必須保證容器不為空。

迭代器相關函式

訪問元素只能用迭代器。然而由於list不能隨機訪問,這些迭代器只是雙向而非隨機迭代器。所以凡是用到隨機訪問迭代器的演算法(所有用來操作元素順序的演算法-特別是排序演算法都歸於此類)都不能呼叫。不過可以用list的成員函式sort()完成此功能。

元素的插入和刪除

list提供deque的多餘功能,還增加了remove()和remove_if()演算法應用於list『身上的特殊版本。這些成員函式比stl的remove演算法更快,因為它們只進行內部指目標工作,無需估計元素。

要將所有與某值相等的元素刪除,可以用如下語句(注意:確實是將這些元素刪除了,而不是像vector那樣只是某種移動而已)

listlist1;

list1.remove(val);

list還提供了其他一些成員函式,用來改變元素和區間的次序,或是重新串鏈。我們可以用他們來移動單一list裡的元素,也可以移動兩個list之間的元素(前提是list的型別一致)。

四、list的異常處理

在所有的stl標準容器中,list提供了最佳支援。幾乎所有的操作都是要麼正確,要麼什麼都不發生。只有少數幾個操作沒有這樣的保證:賦值和sort()。不過他們也不會洩露資源,也不會與容器的恆常特性發生衝突。merge(),remove(),remove_if(),unique()提供的保證是有前提的l就是元素間的比較動作不會丟擲異常。

五、list示例程式

#include #include #include using namespace std;

void outputlists(const list&l1,const list&l2)

int main()

outputlists(ilist1,ilist2);

ilist2.splice(ilist2.end(),ilist2,ilist2.begin());

outputlists(ilist1,ilist2);

ilist2.sort();

outputlists(ilist1,ilist2);

ilist2.unique();

outputlists(ilist1,ilist2);

ilist1.merge(ilist2);

outputlists(ilist1,ilist2);

/*outputlists(ilist3,ilist1);

ilist1.merge(ilist3);

outputlists(ilist3,ilist1);*/

}

執行結果:

注意:merge只使用與合併兩個元素已序(而且都是公升序)排列的的容器。如上面的程式,最後merge ilist1和ilist3程式就會報錯。

C STL常用容器總結之四 鍊錶list

list是每個節點包含前驅指標 後繼指標和資料域三個部分的雙向鍊錶。list不提供隨機訪問,訪問元素需要按順序走到需訪問的元素,時間複雜度為o n 在list的任何位置上執行插入或刪除操作都非常迅速,只需在list內部調整一下指標。list不僅是乙個雙向鍊錶,而且還是乙個環狀雙向鍊錶。所以它只需要乙...

C STL常用容器總結之四 鍊錶list

list是每個節點包含前驅指標 後繼指標和資料域三個部分的雙向鍊錶。list不提供隨機訪問,訪問元素需要按順序走到需訪問的元素,時間複雜度為o n 在list的任何位置上執行插入或刪除操作都非常迅速,只需在list內部調整一下指標。list不僅是乙個雙向鍊錶,而且還是乙個環狀雙向鍊錶。所以它只需要乙...

C STL 常用容器 list

鍊錶是一種物理儲存單元上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點 鍊錶中每乙個元素稱為結點 組成,結點可以在執行時動態生成。每個結點包括兩個部分 乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。相較於vector的連續線性空間,l...