STL原始碼剖析 三 list

2021-10-10 14:28:51 字數 2124 閱讀 2873

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