已學習 C++ 語法(含模板),但未接觸 STL 的初學者。本文為學習筆記風格,資深開發者可跳過。
簡單說:**使用模板的程式設計**。正如「面向物件 = 使用虛函數」,泛型程式設計核心是**型別參數化**——演算法/資料結構與具體型別解耦。
sort(v.begin(), v.end()) 比手寫快排清晰template
T Max(T a, T b) { return a > b ? a : b; }
template
class Stack {
std::vector data;
public:
void push(const T& v) { data.push_back(v); }
T pop() { T v = data.back(); data.pop_back(); return v; }
};
stdSTL 所有符號在 std::,建議**不使用 using namespace std;**,改用 using std::vector; 或完整限定,避免汙染全域命名空間。
| 分類 | 容器 | 特性 | 典型場景 |
|---|---|---|---|
| 序列容器 | vector | 動態陣列、連續記憶體、尾端 O(1) 增刪 | 預設首選、隨機存取 |
| deque | 雙端佇列、分段連續、雙端 O(1) | 雙端操作、大物件避免重新分配 | |
| list | 雙向鏈表、非連續、任意位置 O(1) 插刪 | 頻繁中間插刪、穩定迭代器 | |
| forward_list | 單向鏈表、極省記憶體 | 單向遍歷、極限記憶體敏感 | |
| 關聯容器 | set/multiset | 紅黑樹、有序、唯一/可重複 | 去重、區間查詢、有序集合 |
| map/multimap | 鍵值對、按鍵有序 | 字典、查找表、配置映射 | |
| unordered_set/map | 雜湊表、平均 O(1)、無序 | 高速查找、不需有序 | |
| 容器配接器 | stack/queue/priority_queue | 封裝底層容器、限制介面 | LIFO/FIFO/優先級佇列 |
std::vector v = {1,2,3,4,5};
for (auto it = v.begin(); it != v.end(); ++it)
std::cout << *it << ' '; // 1 2 3 4 5
// C++11 範圍 for (推薦)
for (int x : v) std::cout << x << ' ';
begin()/end()、rbegin()/rend()、cbegin()/cend() (const)
#include
std::vector v = {5,3,1,4,2};
std::sort(v.begin(), v.end()); // 1 2 3 4 5
auto it = std::find(v.begin(), v.end(), 3);
std::copy(v.begin(), v.end(), std::ostream_iterator(std::cout, " "));
find, count, equal, searchcopy, transform, replace, fill, generatesort, stable_sort, partition, nth_elementset_union, set_intersection, set_differencemake_heap, push_heap, pop_heap, sort_heap
#include
#include
int main() {
std::vector q = {10,11,12};
std::vector v;
for (int i=0;i<5;++i) v.push_back(i); // 0 1 2 3 4
auto it = v.begin() + 1; // 指向 1
it = v.insert(it, 33); // 0 33 1 2 3 4
v.insert(it, q.begin(), q.end()); // 0 10 11 12 33 1 2 3 4
it = v.begin() + 3;
v.insert(it, 3, -1); // 插入 3 個 -1
it = v.begin() + 4;
v.erase(it); // 刪除單個
it = v.begin() + 1;
v.erase(it, it+4); // 刪除區間
v.clear(); // 清空
}
| 誤區 | 正確認知 |
|---|---|
| vector 擴容會失效所有迭代器/指標/參考 | 預留 reserve() 減少擴容;需穩定地址用 list 或 deque |
| map[key] 會預設建構值 | 唯讀查找用 find() 或 at() (C++11) |
| 演算法需包含 | 大部分在 |
| 刪除元素迭代器失效 | 用 erase 返回的新迭代器繼續迴圈 |
STL 是 C++ 開發者的**標準武庫**。掌握 容器選擇原則、迭代器分類、演算法分類 三大核心,配合 auto、範圍 for、lambda (C++11) 即可寫出簡潔、高效、可維護的現代 C++ 代碼。建議閱讀《STL 源碼剖析》(侯損) 深入底層實現。