跳转至

STL 容器簡介

分類

序列式容器

  • 向量(vector) 後端可高效增加元素的順序表。
  • 數組(array)C++11,定長的順序表,C 風格數組的簡單包裝。
  • 雙端隊列(deque) 雙端都可高效增加元素的順序表。
  • 列表(list) 可以沿雙向遍歷的鏈表。
  • 單向列表(forward_list) 只能沿一個方向遍歷的鏈表。

關聯式容器

  • 集合(set) 用以有序地存儲 互異 元素的容器。其實現是由節點組成的紅黑樹,每個節點都包含着一個元素,節點之間以某種比較元素大小的謂詞進行排列。
  • 多重集合(multiset) 用以有序地存儲元素的容器。允許存在相等的元素。
  • 映射(map) 由 {鍵,值} 對組成的集合,以某種比較鍵大小關係的謂詞進行排列。
  • 多重映射(multimap) 由 {鍵,值} 對組成的多重集合,亦即允許鍵有相等情況的映射。
什麼是謂詞 (Predicate)?

謂詞就是返回值為真或者假的函數。STL 容器中經常會使用到謂詞,用於模板參數。

無序(關聯式)容器

  • 無序(多重)集合(unordered_set/unordered_multiset)C++11,與 set/multiset 的區別在於元素無序,只關心「元素是否存在」,使用哈希實現。
  • 無序(多重)映射(unordered_map/unordered_multimap)C++11,與 map/multimap 的區別在於鍵 (key) 無序,只關心 "鍵與值的對應關係",使用哈希實現。

容器適配器

容器適配器其實並不是容器。它們不具有容器的某些特點(如:有迭代器、有 clear() 函數……)。

「適配器是使一種事物的行為類似於另外一種事物行為的一種機制」,適配器對容器進行包裝,使其表現出另外一種行為。

  • (stack) 後進先出 (LIFO) 的容器,默認是對雙端隊列(deque)的包裝。
  • 隊列(queue) 先進先出 (FIFO) 的容器,默認是對雙端隊列(deque)的包裝。
  • 優先隊列(priority_queue) 元素的次序是由作用於所存儲的值對上的某種謂詞決定的的一種隊列,默認是對向量(vector)的包裝。

共同點

容器聲明

都是 containerName<typeName,...> name 的形式,但模板參數(<> 內的參數)的個數、形式會根據具體容器而變。

本質原因:STL 就是「標準模板庫」,所以容器都是模板類。

迭代器

請參考 迭代器

共有函數

=:有賦值運算符以及複製構造函數。

begin():返回指向開頭元素的迭代器。

end():返回指向末尾的下一個元素的迭代器。end() 不指向某個元素,但它是末尾元素的後繼。

size():返回容器內的元素個數。

max_size():返回容器 理論上 能存儲的最大元素個數。依容器類型和所存儲變量的類型而變。

empty():返回容器是否為空。

swap():交換兩個容器。

clear():清空容器。

==/!=/</>/<=/>=:按 字典序 比較兩個容器的大小。(比較元素大小時 map 的每個元素相當於 set<pair<key, value> >,無序容器不支持 </>/<=/>=。)