STL 源碼剖析之四:序列式容器

來源:互聯網
上載者:User
文章目錄
  • 1、Vector
  • 2、List
  • 3、Deque
  • 4、Stack
  • 5、Queue
  • 6、heap
  • 7、Priority Queue

stl裡的容器按元素在容器內的相片順序,可以分為序列式和關聯式兩種。

 

所謂序列式容器,其中的元素時可序的,即元素集合呈線性關係。

 

C++本身提供了一個序列式容器array,stl提供了vector,list,deque,stack,queue,priority_queue等序列容器。其中stack和queue由於只是將deque蓋頭換面,在技術上稱之為適配器。

 

1、Vector

vector的元素儲存和訪問方式和array很相似,唯一的不同就在於彈性。array是靜態空間,一旦配置了就不能改變;vector是動態空間,隨著元素的增多或減少,其配置空間的大小可以動態改變。

 

vector的迭代器:由於vector使用的是連續線性空間,所以其迭代器實際就是原生指標,這顯然是個Random Access Iterator。

 

空間配置策略:從效率考慮,當插入元素的時候,如果配置的空間不足,則擴充空間至當前的兩倍,如果任然不足則擴充至所需空間。 插入或刪除元素時,涉及元素的拷貝和初始化。

 

2、List

list是一個雙向鏈表,每次插入或刪除一個元素,就分配或釋放一個元素的空間;所以list對空間的控制十分精確,而且任何位置的插入或刪除需要的時間都是常數。list和vector是兩種最常用的容器,什麼時候選用哪種容器,視元素的多寡、元素的構造複雜度(是否有trivial copy ctor,assignment opt)以及元素存取的行為特性。

 

list的迭代器:list不能再以原生指標作為迭代器,而需要定義特定的iterator類。list迭代器是一種Bidirectional Iterator,支援單步的前進或後退操作。list迭代器有一個重要特點,就是插入操作不會造成原有迭代器的實效,這對vector是不成立的。

 

list的結構:list不僅是一個雙向鏈表,而且是一個帶頭結點的環狀雙向鏈表。

 

list的sort方法:list不能使用stl提供的通用sort演算法,因為sort演算法只接受Random Access Iterator,所以提供了自己的sort方法。sort方法的實現在另一篇中有描述。

 

3、Deque

vector是單向開口的連續線性空間,deque則是一種雙向開口的連續線性空間。所謂雙向開口,意思是可以在頭尾分別做元素的的安插和刪除操作;vector當然也可以在頭尾兩端做動作,但是其頭部動作效率奇差。deque和vector最大的差異在於:deque允許在常數時間內對兩端進行元素的安插或移除操作;deque沒有所謂容量的概念,因為它是以分段的連續空間組合而成,隨時可以增加一段空間拼接起來,不存在像vector那樣“因空間不足而分配一塊更大的空間然後複製元素”問題。

 

deque的迭代器:deque提供random access iterator,但並不是原生指標。其實現的複雜度也很大,這也影響到相關演算法的效率。所以如非必要,應該盡量使用vector而不是deque。對的確進行排序時,可以先將元素複製到一個vector,排序後再複製回deque。

 

deque的儲存結構:deque採用的是一種分段連續空間儲存結構,採用一個map(不是stl中的map)來管理這些空間段。每個空間段的大小是固定的,當有新元素加入而空間不足時,就分配一個新的空間段。當空間段的個數增加時,可能需要分配一個更大的map。 deque的這種結構,是的其迭代器上的操作可能需要跨越空間段,因而具有相當的複雜度。

4、Stack

stack是一種先進後出的資料結構,只可以在頂端進行元素操作。如果有某種雙向開口的資料結構,將其介面改變,符合“先進後出”的特性,就可以形成一個stack:deque和list都是這樣的結構。

 

因此stack的實現非常簡單,它以某種現有的容器作為儲存的實現,定義新的介面。這種容器被稱為container adapter。

template <class T, class Sequence=Deque<T> >

class stack

{

...

}

如上所示,stack預設使用deque來實現,你也可以使用list: stack<int, list<int> >;

 

stack不支援對元素的遍曆,因此沒有迭代器。

5、Queue

queue是一宗先進先出的資料結構,它的實現方案和stack基本一樣。也是屬於container adapter一類。可以基於deque和list。

queue沒有迭代器。 

6、heap

heap並不是stl中的一種容器,它實際是以vector作為完全二叉樹的儲存結構,再加上一些heap演算法。它是priority_queue的背後英雄。

stl定義了一些heap操作的演算法:包括建堆,push_heap,pop_heap,sort_heap等,基本上和《演算法導論》堆排序一章介紹的一致。

7、Priority Queue

priority queue是一種擁有權值概念的queue,加入的元素按權值大小排列。priority_queue也是container adapter,它以vector為儲存結構,再以heap演算法進行處理:priority_queue的元素存放在一個vector當中,按元素權值排列成一個heap。

 

priority queue同樣沒有迭代器。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.