C STL之雙向鍊錶list

2021-09-23 07:41:35 字數 1754 閱讀 7247

一、list的基本使用以及耗時測試:

#include#include//qsort bsearch null

#includeusing namespace std;

const int size = 100000;

int main()

cout << "插入1000000個元素耗時為: " << (clock() - start) << endl;

cout << "list.size()" << l.size() << endl;

cout << "list.front()" << l.front() << endl;

cout << "list.back()" << l.back() << endl;

cout << "list.max_size()" << l.max_size() << endl;//最大容量

/*//演算法都是全域性的

auto it = ::find(l.begin(),l.end(),100);

if (it != l.end())

else

*/

return 0;

}執行結果:

插入1000000個元素耗時為: 130

list.size()100000

list.front()41

list.back()1629

list.max_size()357913941

請按任意鍵繼續. . .

二、list的特點:查詢效率低,因為記憶體是不連續的,需要通過指標挨個遍歷,最壞情況o(n);

前插效率高,o(1);

由於記憶體不是連續的,所以刪除乙個節點不會造成迭代器失效問題;

增加刪除效率高,不需要挪動前後的元素;

鍊錶是沒有operator的,因為鍊錶記憶體不是連續的;

由於list一般都是用雙向鍊錶實現,所以至少有三個指標:前驅、後繼、資料域。這樣一來,在記憶體的耗費上開銷就相對較大。

三、list部分原始碼展示:

template >

class list ;

實際上我們可以看到,list自己實現了sort()方法,而不是標準庫的全域性sort演算法,既然自己實現了sort,那麼一般來說使用自己實現的sort效率當然高了;

提供了鍊錶的合併、切片等成員方法;

正向迭代器和反向迭代器的關係

四、老版本list中節點定義

//雙向環形鍊錶的節點

struct _list_node

;

實際上,我們沒必要糾結原始碼每一步是如何實現的,只需要知道容器底層使用的資料結構和對應的特點,以及對效率的影響,我們用到時如何選擇效率能最高,這才是我們的目的。五、注意事項:

我在stl第一講中提到過,所有的容器和python中表現一樣,都遵循「前閉後開」 原則

什麼意思?就是最後乙個元素得值取不到,為什麼取不到:

因為end()指向得是最後乙個元素得下乙個元素,很明顯這個元素不屬於容器 [ begin(),end()).

C STL之list雙向鍊錶容器

不同於採用線性表順序儲存結構的vector和deque容器,list雙向鍊錶中任一位置的元素查詢 插入和刪除,都具有高效的常數階演算法時間複雜度o 1 list技術原理 為了支援前向和反向訪問list容器的元素,list採用雙向迴圈的鍊錶結構組織資料元素,鍊錶的每個節點包括指向前驅的指標 實際資料和...

c stl的list(雙向鍊錶)

1.list初始化 1 listt 沒有任何元素 2 listt 10 建立有 10個元素的鍊錶 3 listt 10,3 建立有 10個元素的鍊錶,並且每個元素為3 2.對鍊錶進行插入操作 1 前插法 在鍊錶頭部插入新元素,鍊錶自動擴張,形式 t.push front 8 2 尾插法 在鍊錶尾部插...

C STL 10 list 雙向鍊錶

鍊錶 缺點 無法訪問位置 沒有index的概念。陣列可以 index 優點 在序列已知的任何位置插入或刪除元素。可以合併 去重 交換。一樣的增刪改查上 void listtest cout endl int a 5 int b 7 listlst1 a,a 5 listlst2 b,b 7 cout...