在 C++ 標準模板庫(STL)中,容器僅提供了極基本的操作,如元素的增刪、大小查詢、迭代器獲取等。若要實現排序、查找、數值累加等複雜操作,標準庫並未在每個容器中重複實現,而是提供了一套泛型算法。這些算法不依賴特定容器類型,能作用於 vector、list、內建陣列等多種序列上,極大地提升了代碼的復用性與靈活性。
[first, last) 標記操作範圍。find、accumulate)、寫入算法(如 fill、copy、replace)、排序與重排算法(如 sort、unique)。find —— 元素查找在範圍內尋找首個等於指定值的元素,找到返回指向該元素的迭代器,否則返回 last。
int search_value = 42;
auto result = find(vec.begin(), vec.end(), search_value);
if (result == vec.end())
cout << "not present" << endl;
else
cout << "present" << endl;
accumulate —— 區間累加第三參數為初值,返回類型由初值決定,可用於數值求和或字符串拼接。
int sum = accumulate(vec.begin(), vec.end(), 42);
string concat = accumulate(v.begin(), v.end(), string(""));
fill / fill_n —— 區間填充fill 將值寫入 [first, last);fill_n 從 first 起寫入 n 個值,若容器空間不足會越界。
fill(vec.begin(), vec.end(), 0); // 全部歸零
fill_n(back_inserter(vec), 10, 0); // 安全追加 10 個 0
back_inserter 生成插入迭代器,內部調用 push_back 自動擴容,避免越界風險。
copy —— 序列複製copy(ilst.begin(), ilst.end(), back_inserter(ivec)); // 低效
vector<int> ivec(ilst.begin(), ilst.end()); // 推薦:直接構造
replace / replace_copy —— 元素替換replace(ilst.begin(), ilst.end(), 0, 42); // 原地替換
replace_copy(ilst.begin(), ilst.end(), back_inserter(ivec), 0, 42); // 複製並替換,原序列不變
sort / stable_sort —— 排序sort 預設按 operator< 升序;stable_sort 保持相等元素相對順序,並可透過謂詞自定義比較邏輯。
bool IsShort(const string& a, const string& b) {
return a.size() < b.size();
}
stable_sort(words.begin(), words.end(), IsShort); // 按長度排序
unique —— 移除相鄰重複需配合 erase 真正刪除多餘元素,常用於已排序序列。
auto end_unique = unique(words.begin(), words.end());
words.erase(end_unique, words.end());
count_if —— 條件計數bool GT6(const string& s) { return s.size() >= 6; }
auto wc = count_if(words.begin(), words.end(), GT6);
| 後綴 | 含義 | 範例 |
|---|---|---|
_if | 接受一元謂詞版本 | find_if, count_if |
_copy | 結果寫入輸出迭代器,不修改輸入 | replace_copy, remove_copy |
STL 提供 100 多個算法,結構統一、易學易用。掌握「迭代器範圍 + 謂詞/函數對象」的組合模式,即可靈活解決絕大多數序列處理問題,實現真正的泛型編程。