首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ STL 泛型算法詳解:從入門到精通

     編輯:關於C語言

前言

在 C++ 標準模板庫(STL)中,容器僅提供了極基本的操作,如元素的增刪、大小查詢、迭代器獲取等。若要實現排序、查找、數值累加等複雜操作,標準庫並未在每個容器中重複實現,而是提供了一套泛型算法。這些算法不依賴特定容器類型,能作用於 vector、list、內建陣列等多種序列上,極大地提升了代碼的復用性與靈活性。

核心概念

  • 泛型:算法通過迭代器操作元素序列,與容器類型、元素類型解耦。
  • 迭代器範圍:大多數算法接受一對迭代器 [first, last) 標記操作範圍。
  • 分類:只讀算法(如 find、accumulate)、寫入算法(如 fill、copy、replace)、排序與重排算法(如 sort、unique)。

常用算法實戰

1. 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;

2. accumulate —— 區間累加

第三參數為初值,返回類型由初值決定,可用於數值求和或字符串拼接。

int sum = accumulate(vec.begin(), vec.end(), 42);
string concat = accumulate(v.begin(), v.end(), string(""));

3. 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 自動擴容,避免越界風險。

4. copy —— 序列複製

copy(ilst.begin(), ilst.end(), back_inserter(ivec)); // 低效
vector<int> ivec(ilst.begin(), ilst.end());            // 推薦:直接構造

5. replace / replace_copy —— 元素替換

replace(ilst.begin(), ilst.end(), 0, 42);                 // 原地替換
replace_copy(ilst.begin(), ilst.end(), back_inserter(ivec), 0, 42); // 複製並替換,原序列不變

6. 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); // 按長度排序

7. unique —— 移除相鄰重複

需配合 erase 真正刪除多餘元素,常用於已排序序列。

auto end_unique = unique(words.begin(), words.end());
words.erase(end_unique, words.end());

8. 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 多個算法,結構統一、易學易用。掌握「迭代器範圍 + 謂詞/函數對象」的組合模式,即可靈活解決絕大多數序列處理問題,實現真正的泛型編程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved