泛型算法運作於迭代器之上,而非直接操作容器。這帶來關鍵特性:算法永遠不會改變底層容器大小(不增刪元素),只會修改元素值或移動元素位置。
<numeric>)計算區間元素總和或串接字串。第三參數決定運算子與回傳型別。
vectorvec = {1,2,3}; int sum = accumulate(vec.begin(), vec.end(), 0); // 6 vector v = {"a","b","c"}; string concat = accumulate(v.begin(), v.end(), string()); // "abc"
比較兩序列對應元素是否相等。第二序列只需提供起始迭代器。
equal(roster1.cbegin(), roster1.cend(), roster2.cbegin());
將值寫入迭代器指向的 n 個位置。注意:目標區間必須已存在足夠空間。
vectorvec(10); fill_n(vec.begin(), 10, 0); // 正確:vec 有 10 個元素 // fill_n(vec.begin(), 10, 0); // 若 vec 為空,行為未定義
<iterator>)回傳插入迭代器,賦值時自動呼叫 push_back,解決容器空間不足問題。
vectorvec; fill_n(back_inserter(vec), 10, 0); // 自動擴充並填入 10 個 0
copy:將輸入區間拷貝至目的位置。replace:將區間內特定值替換為新值。sort 字典序排序;unique 將相鄰重複元素移至後端,回傳新邏輯結尾迭代器,需搭配 erase 真正刪除。
void elimDups(vector&words) { sort(words.begin(), words.end()); auto end_unique = unique(words.begin(), words.end()); words.erase(end_unique, words.end()); }
謂詞:回傳可作條件值的可呼叫物件。分一元/二元謂詞。
Lambda 表達式:[capture](params)->ret {body}。捕獲列表 & (引用) 或 = (值)。
// 查找長度 >= sz 的第一個元素
auto wc = find_if(words.begin(), words.end(),
[sz](const string &a) { return a.size() >= sz; });
// 列印區間元素
for_each(wc, words.end(), [](const string &s) { cout << s << " "; });
bind (需 <functional>) 產生新可呼叫物件,調整參數順序或綁定固定值。佔位符 _1, _2... 代表新函數的參數。
auto newCallable = bind(callable, arg_list);
| 類別 | 讀/寫 | 掃描 | 支援運算 | 典型容器 |
|---|---|---|---|---|
| 輸入 | 唯讀 | 單遍 | ++ | istream |
| 輸出 | 唯寫 | 單遍 | ++ | ostream |
| 前向 | 讀寫 | 多遍 | ++ | forward_list |
| 雙向 | 讀寫 | 多遍 | ++, -- | list, map |
| 隨機存取 | 讀寫 | 多遍 | +, -, [], <, > | vector, deque, array |
[](int i)->int { ... } 明確指定回傳型別。bind:配合佔位符靈活綁定參數。