std::string — 字符串處理利器+, +=, append, insert, erase, replace, substr, find, rfind, comparec_str() (null 結尾), data() (C++17 保證 null 結尾)#include <string>
#include <algorithm> // for transform
void string_demo() {
std::string s1 = "Hello";
std::string s2 = s1 + ", World!"; // 拼接
s1 += " C++"; // 追加
// 查找與替換
auto pos = s2.find("World");
if (pos != std::string::npos) s2.replace(pos, 5, "STL");
// 大小寫轉換 (需注意 locale)
std::transform(s2.begin(), s2.end(), s2.begin(), ::toupper);
// 分割字符串 (C++20 可用 ranges::views::split)
std::string csv = "a,b,c,d";
std::stringstream ss(csv);
std::string token;
while (std::getline(ss, token, ',')) { /* 處理 token */ }
// 原始字面量 (C++11)
std::string path = R"(C:\Users\Name\Documents)"; // 無需轉義
}
std::vector & std::deque — 動態數組vector 核心特性size() (元素數) vs capacity() (分配容量),reserve() 預分配避免重分配shrink_to_fit() (C++11) 釋放多餘容量deque (雙端隊列) 差異void vector_deque_demo() {
std::vector<int> v = {1, 2, 3};
v.reserve(100); // 預分配
v.push_back(4); // 尾部插入
v.insert(v.begin()+1, 9); // 中間插入 (O(n))
std::deque<int> d = {1, 2, 3};
d.push_front(0); // 頭部插入 O(1)
d.push_back(4); // 尾部插入 O(1)
// 算法配合
std::sort(v.begin(), v.end());
auto it = std::find(v.begin(), v.end(), 3);
if (it != v.end()) v.erase(it);
}
std::list — 雙向鏈表sort(), merge(), splice(), unique(), remove(), reverse() — 比通用算法高效 (不移動元素,只調整指針)void list_demo() {
std::list<int> lst = {5, 2, 8, 2, 1};
lst.sort(); // 成員排序 O(n log n)
lst.unique(); // 刪除相鄰重複 (需先排序)
lst.remove(2); // 刪除所有值為 2 的節點
std::list<int> lst2 = {10, 20};
lst.splice(lst.begin(), lst2); // lst2 內容移動到 lst 開頭,lst2 變空,O(1)
}
std::set & std::multiset — 有序集合std::less,即升序)set:鍵值唯一;multiset:允許重複鍵std::set<T, Comp>,Comp 需嚴格弱序void set_demo() {
std::set<int> s = {3, 1, 4, 1, 5}; // 自動去重: {1,3,4,5}
s.insert(2); // {1,2,3,4,5}
auto it = s.find(3); // 查找
if (it != s.end()) s.erase(it); // 按迭代器刪除
// 區間操作
auto range = s.equal_range(3); // pair<lower_bound, upper_bound>
// multiset 允許重複
std::multiset<int> ms = {1, 1, 2};
ms.insert(1); // {1,1,1,2}
std::cout << ms.count(1); // 3
ms.erase(1); // 刪除所有 1
ms.erase(ms.find(2)); // 刪除一個 2
}
std::map & std::multimap — 關聯映射std::pair<const Key, Value>,按 Key 有序map:Key 唯一;multimap:Key 可重複operator[]:若 Key 不存在會默認構造 Value 並插入 (僅 map 有),查找請用 find() 或 at() (C++11 拋出異常)insert({k,v}), emplace(k,v) (C++11 原地構造),try_emplace (C++17 安全插入)void map_demo() {
std::map<int, std::string> m;
m[1] = "one"; // 插入/修改
m.emplace(2, "two"); // 高效插入
m.insert({3, "three"});
// 遍歷 (有序)
for (const auto& [k, v] : m) { /* C++17 結構化綁定 */ }
// 查找
if (auto it = m.find(2); it != m.end()) { /* it->second */ }
// multimap
std::multimap<int, std::string> mm;
mm.emplace(1, "a");
mm.emplace(1, "b");
auto range = mm.equal_range(1); // 獲取所有 key=1 的元素
for (auto it = range.first; it != range.second; ++it) { /* it->second */ }
// 自定義排序 (降序)
std::map<int, std::string, std::greater<>> desc_map;
}
需要關聯查找 (Key-Value)? ├─ Key 唯一 → std::map / std::unordered_map (哈希, O(1) 平均) └─ Key 可重複 → std::multimap / std::unordered_multimap 僅需存儲元素,頻繁查找/去重? ├─ 有序 → std::set / std::multiset └─ 無序 → std::unordered_set / std::unordered_multiset 序列容器選擇: ├─ 隨機訪問、尾部增刪為主 → std::vector ├─ 雙端增刪、固定大小、BFS → std::deque ├─ 中間頻繁增刪、迭代器穩定性要求高 → std::list └─ 棧/隊列/優先隊列 → std::stack / std::queue / std::priority_queue (適配器)
emplace_back/emplace 避免臨時對象構造拷貝for (auto& [k, v] : map)map.find("key") 直接用字符串字面量查 map<string, ...>,需比較器透明 std::less<>node_type nh = map.extract(it); other_map.insert(std::move(nh)); 零拷貝轉移節點std::sort(std::execution::par, v.begin(), v.end())v | std::views::filter(...) | std::views::transform(...)STL 容器是 C++ 高效開發的基石。掌握各容器的底層數據結構、時間複雜度、迭代器失效規則、成員函數 vs 通用算法 的取捨,並結合現代 C++ 特性 (移動語義、emplace、結構化綁定、Ranges),能編寫出既簡潔又高性能的代碼。實際項目中,建議:
vector,除非有明確理由選其他unordered_map/set (需自定義哈希時用有序版)listfind_if, accumulate, transform, partition 等)map::operator[] 的副作用,查找用 find/contains(C++20)