1. 程式人生 > >STL原始碼剖析(四)序列式容器(vector,list)

STL原始碼剖析(四)序列式容器(vector,list)

容器分為:

序列式容器:array,vector(用演算法呈現heap(由heap實現priority-queue)),list,deque(配接器(stack,queue))

關聯式容器:RB-tree(set,map,multiset,multimap),hashtable(hash_set,hash_map,hash_multiset,hash_multimap)

內含關係:heap內含一個vector,stack和queue內含一個deque,set/map/multiset/multimap內含RB_tree。

vector:

資料安排和操作方式,與array相似,唯一差別在於空間運用的靈活性。

array是靜態空間,一旦配置了就不能改變(若空間不足:1.申請空間,2.copy,3.free之前空間)

vector是動態空間

vector迭代器:

vector維護的是一個連續線性空間,不管元素型別,普通指標都可以作為vector迭代器(vector迭代器就是普通指標)

template<class T,class Alloc=alloc>

class vector{

public:

typedef  T  value_type;

typedef   value_type*   iterator;

};

vector<int>::iterator iiter等價於int * iiter;

vector資料結構

線性連續空間

template<class T,class Alloc=alloc>

class vector{

protected:

iterator start;//目前使用空間的頭

iterator end;//目前使用空間的尾

iterator end_of_storage;//目前可用空間的尾

};

vector的成員函式:size()和capacity()區別在於:

size()返回的是finish-start(裡面的元素個數),而capacity()返回的是end_of_storage-start(目前佔有的空間大小)

一旦size()==capacity(),下次新增元素就會擴充至容量的兩倍,過程如下:

1.確定申請大小,2.分配空間,3.copy元素,4.destroy並釋放原空間到free-list,5.更新偏移

注:一旦空間重新配置,指向原vector的迭代器就都失效了,因為指向的原空間已經不存在

list

每次插入或者刪除,就配置或釋放一個元素空間

list有一個重要性質:插入不會造成原有的list迭代器失效(vector可能失效),刪除操作只有指向被刪除元素的迭代器失效。

list節點結構:

template <class T>

struct __list_node{

typedef void* void_pointer;

void_pointer prev;

void_pointer next;

T data;

};

list迭代器:

template<class T,class Ref,class Ptr>

struct __list_iterator{

typedef __list_iterator<T,&T,*T> literator;

typedef __list_node<T>* link_node;

link_type node;//指向node的節點,為了迭代器遍歷(一開始指向尾端的空白節點)

};

list的資料結構:

SGI list是一個環狀雙向連結串列,只需一個指標,就能遍歷整個連結串列

deque

deque是雙向開口的連續線性空間,vector是單向開口的連續線性空間

vector和deque對比:

1.deque允許常數時間內對頭端進行元素的插入或移除

2.deque沒有capacity概念,它的結構是分段連續空間組合而成,隨時增加一段新的空間並連結起來,

由於第二點,deque的迭代器不是普通指標,複雜度很高,所以非必要的話,儘量使用vector,

如果需要對deque進行排序,為了最高效率,1.deque先複製到vector中,2.vector排序(STL的sort演算法)3.複製回deque

deque中控器:

deque是邏輯上的連續空間,由一段一段的定量連續空間構成,

deque最大任務就是維護其整體連續的假象,避開了vector“重新配置,複製,釋放”的輪迴,代價是複雜的迭代器架構

deque採用一塊所謂的map作為主控(map是一小塊連續空間,每個map節點指向一塊較大的連續線性空間,緩衝區(deque儲存主體))

預設