gcc 版本4.4.0
這次我們看看stl中list是怎樣設計的。首先這個list要分為兩個部分,list結構和list節點的結構。
首先看看list的節點(_list_node) 。
由於 _list_node 是繼承 _list_node_base。所以先來看看_list_node_base
struct _list_node : public _list_node_base
_list_node_base 中只有兩個資料成員: 乙個向前的指標,乙個向後的指標。從這裡可以看出list是乙個雙向鍊錶
struct _list_node_base
;
_list_node 中只有乙個資料成員: data
template
struct _list_node : public _list_node_base
;
鍊錶節點總結如圖:
在看迭代器之前,我們想想為什麼list節點分為了兩個部分,而不是在乙個結構體裡面呢?
也就是說為什麼指標變數和資料變數分開定義?
這裡是為了給迭代器做鋪墊,因為迭代器遍歷的時候不需要資料成員的,只需要前後指標就可以遍歷該list。
來看看迭代器是怎樣寫的
template
struct _list_iterator
;
_m_node 這個變數的型別是上面定義的 list 節點中的指標變數。
typedef _list_iterator<_tp> _self;
//前置 ++
_self& operator++()
//後置 ++
_self operator++
(int
)
從原始碼裡看list是繼承 _list_base,而_list_base中有成員變數 _m_node,這個變數是_list_impl 型別的。_list_impl的成員變數是 _m_node, _m_node是_list_node_base 型別的
template>
class list : protected _list_base<_tp _alloc>
_list_impl _m_impl;
struct _list_impl
: public _node_alloc_type
;
為了方便理解,這裡畫了個類圖。而至於 _list_node_base 上面都已經提及,這裡就不在贅述。
以上介紹了list和list節點的資料結構。
如果讓_m_node指向尾端的乙個空白節點,_m_node就能夠符合stl前閉後開區間的要求。
多個節點的list結構如圖:
在迭代器position所在的位置插入乙個節點。
iterator insert(iterator position, const t& x)
內部呼叫insert
void push_front(const t& x)
void push_bakc(const t& x)
移除迭代器position所指向的節點
iterator erase(iterator position )
內部呼叫 erase
void pop_front()
void pop_back()
STL原始碼剖析 list
相較於vector的連續線性空間,list就顯得複雜許多,它的好處是每次插入或刪除乙個元素,就配置或釋放乙個元素空間。因此,list對於空間的運用有絕對的精準,一點也不浪費。而且,對於任何位置的元素插入或元素移除,list永遠是常數時間。list不僅是乙個雙向鍊錶,而且還是乙個環狀雙向鍊錶。另外,還...
STL原始碼剖析 list!!!
list和vector是兩個最常被使用的容器。相較於vector的連續線性空間,list就顯得複雜許多,它的好處就是每次插入或刪除乙個元素,就配置或釋放乙個元素空間。而且對於任何位置的元素插入或元素移除,list永遠是常數時間。list是乙個雙向鍊錶,stl的list節點結構 template st...
STL原始碼剖析學習五 list
每次插入或者刪除乙個元素,就配置或者釋放空間。插入和刪除元素操作都是常數時間。list的節點 template struct list node 是乙個雙向鍊錶 list的迭代器 不能用普通指標作為迭代器 typedef list node link type link type node list...