STL原始碼剖析 list

2021-08-03 10:08:05 字數 1869 閱讀 3297

相較於vector的連續線性空間,list就顯得複雜許多,它的好處是每次插入或刪除乙個元素,就配置或釋放乙個元素空間。因此,list對於空間的運用有絕對的精準,一點也不浪費。而且,對於任何位置的元素插入或元素移除,list永遠是常數時間。

list不僅是乙個雙向鍊錶,而且還是乙個環狀雙向鍊錶。另外,還有乙個重要性質,插入操作和接合操作都不會造成原有的list迭代器失效,這在vector是不成立的。因為vector的插入操作可能造成記憶體重新配置,導致原有的迭代器全部失效。甚至list的元素刪除操作(erase),也只有「指向被刪除元素」的那個迭代器失效,其他迭代器不受任何影響。

list節點資料結構:

template struct __list_node  

;

list的transfer函式:list內部提供乙個遷移操作(transfer):將連續範圍內的元素遷移到某個特定位置之前。

//將[first, last)內元素移動到position之前

list 的特點:

(1) 不使用連續的記憶體空間這樣可以隨意地進行動態操作;

(2) 可以在內部任何位置快速地插入或刪除,當然也可以在兩端進行push 和pop 。

(3) 不能進行內部的隨機訪問,即不支援[ ] 操作符和vector.at() ;

(4) 相對於verctor 占用更多的記憶體。

list常用操作函式

lst1.assign() 給list賦值 

lst1.back() 返回最後乙個元素 

lst1.begin() 返回指向第乙個元素的迭代器 

lst1.clear() 刪除所有元素 

lst1.empty() 如果list是空的則返回true 

lst1.end() 返回末尾的迭代器 

lst1.erase() 刪除乙個元素 

lst1.front() 返回第乙個元素 

lst1.get_allocator() 返回list的配置器 

lst1.insert() 插入乙個元素到list中 

lst1.max_size() 返回list能容納的最大元素數量 

lst1.merge() 合併兩個list 

lst1.pop_back() 刪除最後乙個元素 

lst1.pop_front() 刪除第乙個元素 

lst1.push_back() 在list的末尾新增乙個元素 

lst1.push_front() 在list的頭部新增乙個元素 

lst1.rbegin() 返回指向第乙個元素的逆向迭代器 

lst1.remove() 從list刪除元素 

lst1.remove_if() 按指定條件刪除元素 

lst1.rend() 指向list末尾的逆向迭代器 

lst1.resize() 改變list的大小 

lst1.reverse() 把list的元素倒轉 

lst1.size() 返回list中的元素個數 

lst1.sort() 給list排序 

lst1.splice() 合併兩個list 

lst1.swap() 交換兩個list 

lst1.unique() 刪除list中重複的元素

STL原始碼剖析 list!!!

list和vector是兩個最常被使用的容器。相較於vector的連續線性空間,list就顯得複雜許多,它的好處就是每次插入或刪除乙個元素,就配置或釋放乙個元素空間。而且對於任何位置的元素插入或元素移除,list永遠是常數時間。list是乙個雙向鍊錶,stl的list節點結構 template st...

STL原始碼剖析 三 list

gcc 版本4.4.0 這次我們看看stl中list是怎樣設計的。首先這個list要分為兩個部分,list結構和list節點的結構。首先看看list的節點 list node 由於 list node 是繼承 list node base。所以先來看看 list node base struct l...

STL原始碼剖析學習五 list

每次插入或者刪除乙個元素,就配置或者釋放空間。插入和刪除元素操作都是常數時間。list的節點 template struct list node 是乙個雙向鍊錶 list的迭代器 不能用普通指標作為迭代器 typedef list node link type link type node list...