快轉到主要內容

STL

目錄

STL (Standard Template Library)
#

STL 中文稱為 標準模板庫,其容器都為模板(Template)創建
因此可以替換 ContainerName<typename, ...> 內的參數來更改容器內的元素型別等

序列容器 (Sequence Containers)
#

Array 陣列
#

跟 C 的陣列差不多

Vector 向量
#

vector 是一個可以改變長度的陣列,尤其是可以從尾端新增元素

Deque 雙端佇列
#

deque 也是一個可以改變長度的陣列,與 vector 不同的是可以從雙端新增元素

List
#

鏈結串列

Forward_List
#

單向的鏈結串列

關聯容器 (Associative Containers)
#

Set 集合
#

儲存不相同的元素容器,底層是由紅黑樹來實現,會將元素進行排序,不支援隨機存取

Map 映射
#

儲存 {鍵 : 值} 的容器,可以將其想像成可以自定義索引值的陣列,會依照鍵進行排序,底層也是由紅黑樹實現

Multiset
#

與 Set 不同的地方在於,不會將重複的元素過濾掉,依樣會將元素進行排序

Multimap
#

與 Multiset 一樣允許相同的的鍵存入容器

無序關聯容器 (Unordered Associative Containers)
#

使用 Hash 實現,因此不會將元素進行排序,在大部分的情況存取速度比較快較快

Unordered_Set
#

Unordered_Map
#

Unordered_Multiset
#

Unordered_Multimap
#

容器配接器 (Container adapters)
#

將容器進行包裝,使其有其他特性
因此他們不具有容器的一些特性,例如:迭代器、clear() 等等

Stack 堆疊
#

LIFO 先進後出,默認是 deque 的包裝

Queue 佇列
#

FIFO 先進先出,默認是 deque 的包裝

Priority_queue
#

設定某種比較條件,使其佇列中的元素會自動排序,默認是 vector 的包裝

共有函式
#

begin():回傳指向容器的第一個元素的迭代器

rbegin():回傳指向容器最後一個元素的反向迭代器

cbegin():回傳指向第一個元素的 const 迭代器

end():回傳指向容器最後一個元素的下一個元素的迭代器

rend():回傳指向容器第一個元素的前一個元素的反向迭代器

cend():自己推

size():回傳容器的元素個數

max_size():回傳理論上容器能夠儲存的最大元素個數(競程不常用到)

empty():回傳容器使否為空的,布林值

swap():交換兩個容器

clear():清空容器內的所有元素

=:賦值或是複製,跟一般變數相同

== / != / < / > / <= / >=:比較容器內的元素大小,大部分為依照字典序進行比較

迭代器
#

因為不同的容器實作方式都不同,為了能夠安全的訪問容器,STL 有一種概念為迭代器,其提供了統一的訪問方式

基礎使用
#

可以將迭代器是為指標,支持兩種運算子:*++,可以用來移動迭代器和對迭代器取值
一般來說一個容器的迭代器語法為:container::iterator

以下為使用迭代器遍歷容器的程式碼範例

vector<int> v(5);

// 使用下標存取
for (int i = 0; i < 5; i++) cin >> v[i];

// 使用迭代器遍歷容器並輸出
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) cout << *it << ' ';

一般來說,在競程上可以用 auto (C++ 11 開始支援) 來代替上述的程式碼

for (auto it = v.begin(); it != v.end(); it++) cout << *it << ' ';

還可以再加上 range-for 迴圈以達到偷懶最佳解

for (auto &i : v) cin >> i;
for (auto i : v) cout << i << ' ';

分類
#

Input Iterator 輸入迭代器:支持複製、增加、訪問

Output Iterator 輸出迭代器:支持複製、增加、賦值

Forward Iterator 前向迭代器:同時滿足輸入和輸出迭代器

Bidirectional Iterator 雙向迭代器:增加支持反向訪問

Random Access Iterator 隨機訪問迭代器:增加支持加減運算和比較運算

相關函式
#

advanced(it, n):將迭代器向後移動 n 步,若 it 為雙向迭代器,可以將 n 設為負數進行向前移動

next(it, n):回傳向前迭代器向後第 n 個的迭代器

prev(it, n):回傳雙向迭代器向前第 n 個的迭代器

序列式容器
#

vector

Piau 的筆記本
作者
Piau 的筆記本
希望我寫下來的東西能夠長久的記在我的腦中