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