STL 序列式容器的總結

2021-08-04 12:14:59 字數 2692 閱讀 6915

序列式容器(sequence containers):所謂序列式容器,其中的元素都可序(ordered),但未必有序(sorted)。c++語言本身提供了乙個序列式容器array,stl另外再提供了vector,list,deque,stack,queue,priority-queue等等序列式容器。其中stack和queue由於只是將deque改頭換面而成,技術上被歸類為一種配接器(adapter)。

array(build-in)  c++內建,vector,heap,priority-queue,list,slist(非標準),deque,stack(配接器),queue(配接器)

筆記介紹順序:

vector,

list,

deque,

stack

queue

heap

priority_queue

slist

1.1 vector 

迭代器:

vector維護的是乙個連續線性空間。

提供的是random access iterators ,所以支援隨機訪問,

記憶體管理:

因舊空間不足而重新配置乙個塊更大的空間,然後複製元素,再釋放空間。

vector以兩個迭代器start和finish分別指向配置得來的連續空間中目前已被分配的範圍,並以迭代器end_of_storage指向整塊連續空間(含備用空間)的尾端。

為了降低空間配置時的速度成本,vector實際配置的大小可能比客戶端需求量更大一些,以備將來的擴充,這便是(capacity)容量的觀點。

array是靜態空間,一旦配置了就不能改變;改變空間需要客戶端自己分配。

vector是動態空間,由內部機制自動擴充空間。

所謂的動態增加大小,是以原大小的兩倍另外配置一塊較大的空間,然後將原內容拷貝過來,然後才開始在原內容之後構造新元素,並釋放原空間。因此,對vector的任何操作,一旦引起空間重新配置,指向原vector的所有迭代器就失效了。

vector的元素操作:pop_back(),erase,clear,insert。

1.2 list

list每次插入或刪除乙個元素,就配置或釋放乙個元素空間。因此,list對於空間的運用有絕對的精準,一點也不浪費。而且對於任何位置的元素的插入和刪除,list永遠是常數時間。

stl list的節點(node)結構:

template

struct _list_node

list 無法像vector一樣以普通指標作為迭代器,因為其節點不保證在儲存空間中連續存在。

list是乙個雙向鍊錶,環狀鍊錶。並且插入操作(insert)和接合操作(splice)都不會造成原有的list迭代器失效。(vector不同)

list的元素操作:push_front(),push_back(),erase,pop_front,pop_back,clear,remove,unique,splice,merge,reverse,sort

1.3 deque

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

因為他是動態的以分段連續空間組合而成,隨時可以增加一段新的空間而鏈結起來。

除非必要,應該選用vector而不是deque。對deque的排序操作,為了最高效率,可將deque先完整複製到乙個vector身上,將vector排序(利用stl sort演算法)後,再複製回deque.

deque的中控器

deque是連續空間(至少邏輯上看來如此),是由一段一段的定量連續空間構成,一旦有必要再deque的前端和尾端增加新空間,便配置一段定量連續空間,串接在整個deque的頭端和尾端。

deque採用一塊所謂的map(不是stl的map容器)作為主控。這裡的map是一塊連續的空間,其中每個元素都是指標,指向另一段(較大的)連續線性空間,稱為

緩衝區。緩衝區才是deque的儲存空間主體。

deque的元素操作:pop_back,pop_front,clear,erase,insert。

1.4 stack

以list作為底層容器

元素操作有:empty,size,back,push_back,pop_back。

1.5 queue

以list作為queue的底層容器

元素操作有:empty,size,front,back,push_front,push_back,pop_front,pop_back。

1.6 heap

heap並不屬於stl容器元件,是priority queue的助手。

binary max heap 是priority queue 的底層機制。

heap的所有元素都必須遵循特別的(complete binary tree)排列規則,所以heap不提供遍歷功能,也不提供迭代器。

1.7 priority_queue

由於這是乙個queue,所以只允許在低端加入元素,並從頂端取出元素。

priority_queue 帶有權值觀念,其內的元素並非依照被推入的次序排列,而是自動依照元素的權值排列(通常權值以實值表示)。權值最高者,排在最前面。

由於priority_queue完全以底部容器(預設下以vector為底部容器)為根據,再加上heap處理規則,所以其實現非常簡單。

1.8 slist 

slist是單鏈表,迭代器屬於單向的。list是雙鏈表,迭代器屬於雙向的。

基於效率考慮,slist只提供push_front()。因此slist的元素次序會和元素插入進來的次序相反。

STL 序列式容器細節

stl 序列式容器細節 一 概論 1 序列式容器 array build in c 內建 vector heap內含乙個vector priority queue內含乙個heap list slist deque stack內含乙個deque queue內含乙個deque 2 關聯式容器 rb tr...

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維護的是乙個連續線性空間...