《STL 原始碼剖析》 list 實現原理

2022-09-14 15:06:16 字數 1894 閱讀 3972

目錄list對空間的運用是精準的,不浪費的。對於任何位置的元素插入 或 元素移除,list永遠是常數時間。

list實現上就是乙個雙向迴圈鍊錶,list節點 有prev 和 next 兩個指標。

因為list是乙個雙向鍊錶,他的迭代器就必須具備前移、後移的能力。list提供的是 bidirectional iterators。

list性質:插入操作、接合操作,不會造成原有的list迭代器失效,即使刪除操作,也只是 被指向刪除元素的 那個迭代器失效,其他不受影響。(這個和vector 有很大差別)

list是乙個 環狀雙向鍊錶,因此它只需要乙個指標就能夠 表現出整個完整鍊錶

template class list

;

node指向尾端的乙個空白節點,就能符合 」前閉後開「 區間的要求。

基本操作:

iterator begin() 

iterator end()

bool empty() const

size_type size() const

reference front()

reference back()

class list

// 分配乙個節點並傳回

void put_node(link_type p) // 釋放節點

link_type create_node(const t& x) // 分配空間 並 構造

void destory_node(link_type p) // 析構 並 釋放空間

public:

list() // 構造空鍊錶

void push_back(const t& x)

iterator insert(iterator position, const t& x)

protected:

void empty_initialize()

...};

將連續範圍的元素遷移到特定位置之前,實現上就是 節點指標的重新連線。

transfer 是 其他複雜操作的基礎,如splice、sort、merge

transfer 不是公開介面

對於transfer的巧妙運用

void splice(iterator position, list& x) //將 x 拼接到 position位置之前

void splice(iterator position, list&, iterator i) // 將i的元素拼接到position之前,兩者 可能是同乙個list

// 將[first, last)的元素接到position位置之前

// position 和 [first, last) 可能會指向同乙個list

// 但是 position 不能位於[first,last)

void splice(iterator position, list&, iterator first, iterator last)

前提:兩個 已經 排好序的鍊錶

遍歷其中乙個鍊錶,記錄過程中 遍歷 頭尾指標(遍歷過程中進行大小比較)。將其拼接到另乙個鍊錶上。

實現上 和 普通鍊錶合併 是類似的。

template void list::merge(list& x)

else

++first1;

}if(first2!=last2) transfer(last1, first2, last2); // 如果末尾還有殘留部分

}

STL原始碼剖析 list

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