C STL標準庫容器 概覽

2021-10-02 14:19:35 字數 2725 閱讀 3907

本文對c++中的stl標準庫容器進行概覽,作為筆者平時的學習筆記,以茲備忘。同時,本文作為乙個目錄,接下來對常用容器,比如vector,map等的 具體介紹的博文將會由本文進行索引。

c++的標準容器庫中提供了一系列的容器模版,可以作為日常工作生產中的資料結構使用,以此減少了程式設計師很多去造輪子的工作量。容器(container),顧名思義,是一種按照某種特性,用於儲存某種型別資料的一種資料結構,其中通常還包含了若干對這種資料結構進行運算的演算法,比如出棧,入棧,排列等等,c++將整個資料容器視為一種資料容器類,方便程式設計師的使用。通常來說,c++標準容器可以分為以下四大型別:

序列容器(sequence containers)

序列容器介面卡 (sequence container adapters)

關聯容器 (associative containers)

無序關聯容器 (unordered associative containers)

我們分別簡單介紹這四大型別容器中的常用的容器模版。

序列容器以一種線性的方式去儲存相同型別的資料型別的一系列資料。包括:

array, 靜態的,連續陣列,類似於c語言中的陣列。

vector,動態的,連續陣列,其長度可以隨著插入或者移除的元素而變化。

forward_list,單向鍊錶

list,雙向鍊錶

deque,一種雙端佇列,元素可以在該佇列的頭部或者尾部插入和彈出。(不能在中間插入,只能在兩端插入)

template

<

classt,

class

container

= std::deque

>

class

stack

;

注意到這個stack容器預設情況下是對std:deque的一種封裝,包裹。你也可以指定特定的容器,取代這裡的deque

標準容器中的容器介面卡有:

stack,提供lifo的資料結構

queue,提供了fifo的資料結構

priority_queue,提供了乙個優先佇列,其允許在該佇列中以常數時間複雜度去檢索最大的元素(預設情況下)

關聯容器提供了一種排序後的資料結構,配合對keys的檢索,可以提供乙個快速的檢索,時間複雜度為o

(log⁡(

n)

)\mathcal(\log(n))

o(log(n)

)。在stl的關聯容器中,其按照檢索的keys,可分為兩大類:a. 每個元素都只有唯一的key; b. 可以用相同的key檢索多個元素。

set,唯一key檢索,根據key的某些特性進行排序(比如數值大小,首字母順序等)

mapkey-value對的集合,也是根據key的某些特性進行排序(比如數值大小,首字母順序等)

-> 這兩者通常都是通過紅黑樹進行實現的。

我們以set為例,觀察下其模版原型:

template

<

class

key,

class

compare

= std::less

,class

allocator

= std::allocator

>

class

set;

我們發現,我們可以指定其排列的規則,預設是std:less

無序關聯容器,類似於關聯容器,不過其是無序的,不需要對元素進行排序,通常根據hash進行索引。在最差的情況下,其時間複雜度是o(n

)\mathcal(n)

o(n)

,不過大部分時候都遠比線性操作要快得多,可以視為o(1

)\mathcal(1)

o(1)

,即是在常數時間內就可以對元素進行檢索。無序關聯容器有:

unordered_multiset,類似於multiset,只不過是無序的。

unordered_multimap,類似於multimap,只不過是無序的。

unordered_set的模版原型為例子,有:

template

<

class

key,

class

hash

= std::hash

,class

keyequal

= std::equal_to

,class

allocator

= std::allocator

>

class

unordered_set

;

[1].

c 標準庫容器使用概覽

容器用於儲存一組相同型別元素,因此乙個容器可以看作是一類資料的集合。容器按其對元素的管理形式分為值容器和引用容器兩種型別。值容器裡,插入乙個元素時,容器儲存的是乙個元素的副本,而引用型別容器則是儲存該元素的引用或者位址。值容器可以簡單的模擬引用容器,只需要把元素型別定義為指標就可以了,因此值容器更為...

c STL庫容器之map

map是stl的乙個關聯容器,它的特點是增加和刪除節點對迭代器的影響很小,除了那個操作節點,對其他的節點都沒有什麼影響。對於迭代器來說,可以修改實值,而不能修改key。它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值 的資料處理能力,由於這個特性,...

c STL庫容器之向量vector

vector向量是一種順序行容器。相當於陣列,但其大小可以不預先指定,並且自動擴充套件。它可以像陣列一樣被操作,由於它的特性我們完全可以將vector 看作動態陣列。在建立乙個vector 後,它會自動在記憶體中分配一塊連續的記憶體空間進行資料儲存,初始的空間大小可以預先指定也可以由vector 預...