STL (Standard Template Library) 是 C++ 標準庫核心,提供高效、通用、可複用的資料結構與演算法。本文面向具備 C++ 模板基礎的初學者,系統介紹 STL 三大核心組件 (容器、演算法、迭代器) 及函數物件、配接器等進階組件,附 19 個可編譯執行的完整範例程式碼。
| 組件 | 角色 | 關鍵類別/函數 |
|---|---|---|
| 容器 | 儲存資料的資料結構 | vector, list, deque, set, map, stack, queue |
| 演算法 | 操作容器資料的通用函數 | sort, find, copy, transform, accumulate |
| 迭代器 | 連接容器與演算法的泛型指標 | iterator, const_iterator, reverse_iterator |
| 函數物件 | 可像函數呼叫的物件 | less, greater, 自訂仿函數 |
| 配接器 | 修改介面以符合需求 | stack/queue (容器配接), reverse_iterator (迭代器配接) |
vector v1; // 空
vector v2(10, 6); // 10 個 6
vector v3(v2.begin(), v2.begin()+3); // 區間複製
v1.push_back(2); // 尾端新增
v1.insert(v1.begin()+1, 5); // 中間插入
v2.assign(8, 1); // 重新指派
cout << v1.front() << v1.back() << v1[4] << v1.at(4);
v1.pop_back(); v1.erase(v1.begin()+1, v1.end()-2);
push_front/pop_front,隨機存取、中間增刪同 vectorcapacity/reservedeque dq;
dq.push_back(2); dq.push_front(5); // 雙端新增
dq.insert(dq.begin()+1, 3, 9); // 中間插入 3 個 9
operator[]sort, merge, splice, uniquelist L1, L2;
L1.sort(); L2.sort(); L1.merge(L2); // 合併兩有序串列
L1.splice(pos, L2); // 將 L2 插入 pos 前,L2 變空
L1.splice(pos, L2, it); // 移動單一元素
L1.splice(pos, L2, first, last); // 移動區間
set 鍵值唯一,multiset 允許重複set s; s.insert(3); // 回傳 pair
multiset ms; ms.insert(s.begin(), s.end());
ms.insert(arr, arr+10); // 可重複
// 集合運算:set_union, set_intersection, set_difference
pair,map 鍵唯一支援 operator[],multimap 鍵可重複不支援 []map m; m['c']=3; m['a']=1;
for (auto& p : m) cout << p.first << ':' << p.second;
multimap mm;
mm.insert({"Tom", "student"}); mm.insert({"Tom", "boy"});
auto range = mm.equal_range("Tom"); // 取得所有 Tom 的值
標頭檔 <algorithm>,泛型函數不屬於容器成員,通用於任何迭代器區間。
int a[6]={1,12,3,2,1215,90}, b[6]={2,5,6,9,0,-56}, c[7];
copy(a, a+6, c); // 複製
reverse(a, a+6); // 反轉
swap_ranges(a, a+6, b); // 區間交換
vector v(a, a+10);
auto it = find(v.begin(), v.end(), 2); // 查找單值
it = search(v.begin(), v.end(), v2.begin(), v2.end()); // 查找子序列
int cnt = count(v.begin(), v.end(), 5); // 計數
sort(a, a+10); // 排序
merge(a, a+10, b, b+5, d); // 合併兩有序區間
bool b = includes(a, a+10, b, b+5); // 區間包含關係
標頭檔 <iterator>,6 種分類:
vector/deque:隨機存取;list/set/map:雙向// 流迭代器範例:檔案→向量→螢幕
vector v;
copy(istream_iterator(file), istream_iterator(),
inserter(v, v.begin()));
copy(v.begin(), v.end(), ostream_iterator(cout, " "));
標頭檔 <functional>,重載 operator() 的類別。
// 自訂仿函數
struct IntMax { int operator()(int x, int y) const { return x>y?x:y; } };
cout << IntMax()(3,4); // 4
// STL 風格:繼承 unary_function/binary_function
struct Adder : unary_function {
double sum = 0;
void operator()(double x) { sum += x; }
};
Adder r = for_each(v.begin(), v.end(), Adder());
cout << "Sum: " << r.sum;
stack (LIFO)、queue (FIFO)、priority_queue (堆積),底層預設 dequereverse_iterator (反向)、insert_iterator (插入)、ostream_iterator (輸出)not1/not2 (否定)、bind1st/bind2nd (綁定)、ptr_fun/mem_fun (函數指標轉仿函數) — C++11 後建議用 std::bind/Lambda| 檔案 | 示範內容 |
|---|---|
| stl_cpp_1.cpp | 傳統陣列平均值 |
| stl_cpp_2.cpp | vector 基本操作與迭代器遍歷 |
| stl_cpp_3.cpp | vector 進階插入/刪除/清除 |
| stl_cpp_4.cpp | 函數模板 max |
| stl_cpp_5.cpp | 類別模板 ex_class |
| stl_cpp_6.cpp | 命名空間 namespace |
| stl_cpp_7.cpp | vector 區間建構 |
| stl_cpp_8.cpp | vector 完整功能演示 |
| stl_cpp_9.cpp | deque 完整功能演示 |
| stl_cpp_10.cpp | list sort/merge/splice |
| stl_cpp_11.cpp | set/multiset 插入與集合運算 |
| stl_cpp_12.cpp | map 基本操作 |
| stl_cpp_13.cpp | multimap 多值查找 |
| stl_cpp_14.cpp | 可變序列演算法 copy/reverse/swap |
| stl_cpp_15.cpp | 不可變序列演算法 find/search/count |
| stl_cpp_16.cpp | 排序演算法 sort/merge/includes |
| stl_cpp_17.cpp | 流迭代器檔案處理 |
| stl_cpp_18.cpp | 自訂仿函數 IntMax |
| stl_cpp_19.cpp | STL 風格仿函數 Adder + for_each |
int main() { return 0; }、#include <iostream> using namespace std;cin.get(); 暫停觀察結果掌握「容器儲資料、演算法處理資料、迭代器串連兩者」的核心三角關係,即掌握 STL 精髓。建議先跑通 19 個範例,再嘗試修改資料型別、替換演算法、組合容器,體會泛型程式設計的威力。STL 是現代 C++ 開發者的必修課,早精通早受益。