標準函式庫 (Standard Template Libiary, STL)
什麼是 STL?
C++ 內建的資料結構,將一些常見寫成模板,可以方便使用。
型態模板 <>
當你要使用容器時,你必須要告訴 C++ 說,你的資料型態是什麼,型態模板的用途就是在於此。
用法: C <T> name
而容器內部東西不會只有一個,像 map 就需要兩種型態。 map <T1, T2> name
有時候參數不須寫滿,不寫滿的地方的值為預設值。
迭代器 (Iterator)
如果你想在容器中遍歷,你可能想用下標運算子 []
,但不是所有容器都像陣列,都有支援下標運算子,所以 C++ 為每個容器都提供一個資料型態叫 "迭代器",你可以把迭代器當成一種指標,假設有一個迭代器 it,加上星號 *
可以存取 IT 所指向的內容,依據迭代器的強到弱可分為三種:
- 隨機存取(Random Access):可與整數做 +- 法、遞增及遞減
- 雙向(Bidirectional)迭代器:遞增及遞減
- 單向(Forward)迭代器:只能遞增 根據用法可分為兩種:
- 輸入(Input)迭代器:讀取迭代器指向的內容,所有的迭代器都可以當作輸入迭代器。
- 輸出(Output)迭代器:更改迭代器指向的內容時,除了常數(const)迭代器(也就是規定不能更動迭代器指向的內容)以外,所有的迭代器都可以當作輸出迭代器。
C++ 在許多容器中提供正向和逆向迭代器,前者由前往後,後著由後往前,宣告時分別為
C::iterator
及C::reverse\_iterator
,每種迭代器分別有一對迭代器代表頭尾,如下表,注意 end 系列指向該容器最後一項的後一項,不要對他做人和取值或修改。
正向 | 逆向 | |
---|---|---|
可改值 | C.begin(), C.end() | C.rbegin(), C.rend() |
不可改值 | C.cbegin(), C.cend() | C.crbegin(),C.crend() |