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

C++ Primer 第五版第十章:泛型算法精要筆記

     編輯:關於C++

核心觀念:算法與容器解耦

泛型算法運作於迭代器之上,而非直接操作容器。這帶來關鍵特性:算法永遠不會改變底層容器大小(不增刪元素),只會修改元素值或移動元素位置。

1. 唯讀算法

accumulate (需 <numeric>)

計算區間元素總和或串接字串。第三參數決定運算子與回傳型別。

vector vec = {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

比較兩序列對應元素是否相等。第二序列只需提供起始迭代器。

equal(roster1.cbegin(), roster1.cend(), roster2.cbegin());

2. 寫入元素算法

fill_n

將值寫入迭代器指向的 n 個位置。注意:目標區間必須已存在足夠空間。

vector vec(10);
fill_n(vec.begin(), 10, 0); // 正確:vec 有 10 個元素
// fill_n(vec.begin(), 10, 0); // 若 vec 為空,行為未定義

back_inserter (需 <iterator>)

回傳插入迭代器,賦值時自動呼叫 push_back,解決容器空間不足問題。

vector vec;
fill_n(back_inserter(vec), 10, 0); // 自動擴充並填入 10 個 0

copy / replace

  • copy:將輸入區間拷貝至目的位置。
  • replace:將區間內特定值替換為新值。

3. 重排容器元素算法

sort / unique

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());
}

4. 定制操作:謂詞與 Lambda

謂詞:回傳可作條件值的可呼叫物件。分一元/二元謂詞。
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 << " "; });

5. 參數綁定

bind (需 <functional>) 產生新可呼叫物件,調整參數順序或綁定固定值。佔位符 _1, _2... 代表新函數的參數。

auto newCallable = bind(callable, arg_list);

6. 迭代器分類與算法需求

類別讀/寫掃描支援運算典型容器
輸入唯讀單遍++istream
輸出唯寫單遍++ostream
前向讀寫多遍++forward_list
雙向讀寫多遍++, --list, map
隨機存取讀寫多遍+, -, [], <, >vector, deque, array

C++11 重點回顧

  • Lambda 表達式:無名內聯函數,簡化謂詞撰寫。
  • 尾置回傳型別:[](int i)->int { ... } 明確指定回傳型別。
  • bind:配合佔位符靈活綁定參數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved