順序容器:
順序容器包括:vector、deque、list、forward_list、array以及string
vector:可變大小數組,即將元素保存在一段連續的內存空間中。支持快速隨機訪問。在尾部之外的位置插入刪除元素可能會很慢。
PS:當元素已經占滿了預先分配的內存空間,插入新的元素時,開辟一段新的內存空間,大小為之前vector的兩倍,再將vector內的元素拷貝到新的內存空間內。
vector的插入刪除操作會造成迭代器的失效
list:雙向鏈表。只支持雙向順序訪問。在list任何位置進行插入、刪除都很快。
注意幾個函數:
splice 將1個list的一段連續數據接在另一個list的某個位置之前
merge、sort(使用的是快排)
deque:雙向隊列,雙端開口的連續空間(邏輯上看來是這樣的,但並不是vector那樣的線性連續空間)。在頭尾位置插入刪除數據很快。
deque與vector的差異:
1.deque允許常數時間內對頭端進行數據的插入或刪除。
2.deque沒有所謂的容量觀念,因為它是動態地以分段連續空間組合而成,隨時可以增加一段新的空間並鏈接起來。
deque的實現原理:
deque實際上由一段一段的定量連續空間鏈接構成,一旦有必要在deque的頭部或尾部增加新的空間,便配置一段定量連續空間,串接在整個deque的頭端或尾端。
因此deque必須要有一個中央控制組件來維護整體連續的假象並提供隨機存取的接口。
deque采用一小塊連續空間稱為所謂的“map”,“map”內的每一個元素都是指針,指向另一段較大的連續內存空間,被稱為緩沖區,緩沖區既是deque存儲空間的主體。
如何維持“整體連續“的假象?
通過對deque的迭代器的operator++與operator--的重載來實現。
通過源碼可以看到deque的迭代器類內有這么幾個成員
T* cur; 此迭代器所指緩沖區中的現行元素
T* first; 此迭代器所指緩沖區中的頭
T* last; 此迭代器所指緩沖區中的尾
map_point node; 指向“map”中對應的元素
stack
stack是以deque或list為底部結構,並將其接口改變,以符合“先進后出”的特性來實現的。嚴格來說不算STL容器中的一類,STL把這種稱為container adapter。
PS:stack沒有迭代器
queue
queue與stack同理。
順序容器還有
forward_list 單向鏈表
string 與vector相似的容器,專門用於保存字符。