STL 序列式容器細節

2021-07-07 04:32:46 字數 3205 閱讀 6234

【stl】序列式容器細節 

一、概論

1、序列式容器

array(build-in) c++內建

vector

heap內含乙個vector

priority-queue內含乙個heap

list

slist

deque

stack內含乙個deque

queue內含乙個deque

2、關聯式容器

rb-tree

set內含乙個rb-tree

map內含乙個rb-tree

multiset內含乙個rb-tree

multimap內含乙個rb-tree

hashtable

hash_set內含乙個hashtable

hash_map內含乙個hashtable

hash_multiset內含乙個hashtable

hash_multimap內含乙個hashtable

3、所謂序列式容器,其中的元素都可序,但未必有序。

二、vector

1、vector的資料安排以及操作方式,與array非常相似,兩者的唯一差別在於空間的運用的靈活性。

array是靜態空間,一旦配置了就不能改變。

vector是動態空間,隨著元素的加入,它的內部機制會自行擴充空間以容納新元素。

2、vector的實現技術,關鍵在於其對大小的控制以及重新配置時的資料移動效率。

3、vector提供random access iterator

4、vector的資料結構

線性連續空間

以兩個迭代器start和finish分別指向配置得來的連續空間中目前已經被使用的範圍,並以迭代器end_of_storage

指向整塊連續空間(含備用空間)的尾端。

當增加新元素時,如果超過當時的容量,則容量會擴充至兩倍。如果兩倍容量仍不足,則擴充至足夠大的容量。

容量大於等於其size。

容量的擴張必須經歷「重新配置、元素移動、釋放原空間」等過程,工程浩大。

5、vector的構造與記憶體管理

所謂動態增加大小,並不是在原空間之後接續新空間(因為無法保證原空間之後尚有可供配置的空間),而是以原大小的兩倍

另外配置一塊較大空間,然後將原內容拷貝過來,然後才開始在原內容之後構造新元素,並釋放原空間。

因此,對vector的任何操作,一旦引起空間重新配置,指向原vector的所有迭代器就都失效了。

6、stl對於「插入操作」的標準規範:插入完成後,新節點將位於哨兵迭代器所指之節點的前方。

三、list

1、相較於vector的連續線性空間,list就顯得複雜許多,它的好處是每次插入或刪除乙個元素,就配置或釋放乙個元素空間。

對於任何位置的元素插入或元素移除,list永遠是常數時間。

2、list的實現是乙個環狀雙向鍊錶,只需要乙個指標,便可以完整表現整個鍊錶。

只要刻意在環狀鍊錶的尾端加上乙個空白節點,便符合stl規範之「前閉後開」區間。

3、list提供 bidirectional iterator

四、deque

1、vector是單向開口的連續線性空間,而deque則是一種雙向開口的連續線性空間。所謂雙向開口,表示可以在頭尾兩端分別

做元素的插入和刪除操作。

2、deque和vector的最大差異:

a、deque允許常數時間內對頭端進行元素的插入或移除操作

b、deque沒有容量概念,因為它是動態地以分段連續空間組合而成,隨時可以增加一段新的空間並鏈結起來。

3、deque也提供random access iterator,但複雜度很高,除非必要,盡可能選擇vector

4、deque的中控器

deque由一段一段的定量連續空間構成,deque採用一塊所謂的map作為主控,這裡的map是一小塊連續空間,其中每

個元素都是指標,指向另一段連續線性空間,稱為緩衝區。緩衝區才是deque的儲存空間主體。

5、deque的迭代器

deque是分段連續空間,維持其「整體連續」假象的任務,落在了迭代器的operator++和operator--運運算元身上。

每個緩衝區大小一樣。

五、stack

1、stack是filo的資料結構,只有乙個出口。

2、stack以deque為底部結構,因此stack往往不被歸類為container,而被歸類為container adapter

3、stack不提供走訪功能,也不提供迭代器。

六、queue

1、queue是fifo的資料結構,有兩個出口。

2、queue以deque為底部結構,因此queue往往不被歸類為container,而被歸類為container adapter

3、queue不提供遍歷功能,也不提供迭代器。

七、heap

1、heap並不歸屬於stl容器元件,它是個幕後英雄,扮演priority queue 的助手。

2、priority queue允許使用者以任何次序將任何元素推入容器內,但取出時一定是從優先順序最高的元素開始取。

3、binary heap是一種完全二叉樹,通過簡單的位置規則,array可以輕易實現出完全二叉樹,這種以array表述tree的方式,

我們稱為隱式表述法。

4、array的缺點是無法動態改變大小,而heap卻需要這項功能,因此,以vector代替array是更好的選擇。

5、heap不提供遍歷功能,也不提供迭代器。

6、經過排序後的heap不再是乙個合法的heap,需要再做乙個heap

八、priority queue

1、priority queue是乙個擁有權值觀念的queue,由於是queue,只允許在底端加入元素,並從頂端取出元素。

2、priority queue帶有權值觀念,其內的元素並非按照被推入的次序排列,而自動按元素的權值排列。

3、priority queue以vector為底部結構再加上heap處理規則,因此其往往不被歸類為container,而被歸類為container adapter

4、priority queue不提供遍歷功能,也不提供迭代器。

九、slist

1、slist是單向鍊錶,這個容器並不在標準規格之內。

2、slist的迭代器屬於forward iterator,而list的迭代器輸入bidirectional iterator

十、總結

序列式容器的重點在於vector、list、deque的理解,清楚了其內部實現,在實際中就可以應用得當。

STL序列式容器 heap

stl heap主要有以下幾種操作組成 make heap,建堆 sort heap,堆排序 pop heap,取出堆頂元素 push heap,調整堆 heap並不歸屬於stl容器元件,它是個幕後英雄,扮演priority queue的助手。binary max heap適合作為priority ...

STL序列式容器概述

stl容器分為序列式和關聯式兩種,序列式容器,其中的元素都可序,但未必有序 heap內含乙個vector,priority queue內含乙個heap,stack和queue都內含乙個deque 1.以vector為底層實現 1.1 vectorvector詳情 vector維護的是乙個連續線性空間...

STL之序列式容器 一 什麼是序列式容器

序列容器以線性序列的方式儲存元素。它沒有對元素進行排序,元素的順序和儲存它們的順序相同。一般來說,有 5 種標準的序列容器,每種容器都具有不同的特性 現在我們來說說序列式容器到底是什麼。所謂序列容器,即以線性排列 類似普通陣列的儲存方式 來儲存某一指定型別 例如 int double 等 的資料,需...