演算法函式庫
演算法函式庫定義了用於多種目的(如搜尋、排序、計數、操作)的函式,這些函式作用於元素範圍。請注意,範圍被定義為 [first, last),其中 last 指向要檢查或修改的最後一個元素之後的位置。
目錄 |
[編輯] 受約束的演算法 (自 C++20 起)
C++20 在命名空間 std::ranges 中提供了大多數演算法的受約束版本。在這些演算法中,範圍可以被指定為一個迭代器-哨兵 (sentinel) 對,或者作為單個 range 引數,並且支援投影 (projections) 和指向成員指標的可呼叫對象。此外,大多數演算法的回傳型別已被更改,以回傳演算法執行期間計算出的所有潛在有用資訊。
std::vector<int> v{7, 1, 4, 0, -1}; std::ranges::sort(v); // constrained algorithm
[編輯] 執行策略 (自 C++17 起)
大多數演算法都有接受執行策略的重載版本。標準函式庫演算法支援多種執行策略,且函式庫提供了相應的執行策略型別與物件。使用者可以藉由呼叫平行演算法並傳入對應型別的執行策略物件,來靜態選擇執行策略。
標準函式庫的實作(而非使用者)可以定義額外的執行策略作為擴充。使用實作定義型別之執行策略物件呼叫的平行演算法,其語義由實作定義。
只要 std::is_trivially_copy_constructible_v<T> 與 std::is_trivially_destructible_v<T> 皆為 true(其中 T 是元素的型別),演算法的平行版本(std::for_each 與 std::for_each_n 除外)就被允許對範圍內的元素進行任意複製。
| 定義於標頭檔
<execution> | |
| 定義於命名空間
std::execution | |
| (C++17)(C++17)(C++17)(C++20) |
執行策略型別 (類別) |
| (C++17)(C++17)(C++17)(C++20) |
全域執行策略物件 (常數) |
| 定義於命名空間
std | |
| (C++17) |
測試類別是否代表一個執行策略 (類別模板) |
| 功能測試巨集 | 數值 | 標準 | 功能 |
|---|---|---|---|
__cpp_lib_parallel_algorithm |
201603L |
(C++17) | 平行演算法 |
__cpp_lib_execution |
201603L |
(C++17) | 執行策略 |
201902L |
(C++20) | std::execution::unsequenced_policy |
[編輯] 不修改序列的操作
[編輯] 批次操作
| 定義於標頭檔
<algorithm> | |
| 將一元函式物件套用於範圍中的元素 (函式模板) | |
| (C++20) |
將一元函式物件套用於範圍中的元素 (演算法函式物件) |
| (C++17) |
將函式物件套用於序列的前 N 個元素 (函式模板) |
| (C++20) |
將函式物件套用於序列的前 N 個元素 (演算法函式物件) |
[編輯] 搜尋操作
| 定義於標頭檔
<algorithm> | |
| (C++11)(C++11)(C++11) |
檢查謂詞對範圍中所有、任一或不滿足任何元素是否為 true (函式模板) |
| (C++20)(C++20)(C++20) |
檢查謂詞對範圍中所有、任一或不滿足任何元素是否為 true (演算法函式物件) |
| (C++23)(C++23) |
檢查範圍是否包含給定的元素或子範圍 (演算法函式物件) |
| (C++11) |
尋找第一個滿足特定條件的元素 (函式模板) |
| (C++20)(C++20)(C++20) |
尋找第一個滿足特定條件的元素 (演算法函式物件) |
| (C++23)(C++23)(C++23) |
尋找最後一個滿足特定條件的元素 (演算法函式物件) |
| 在特定範圍中尋找最後一個元素序列 (函式模板) | |
| (C++20) |
在特定範圍中尋找最後一個元素序列 (演算法函式物件) |
| 搜尋一組元素中的任何一個 (函式模板) | |
| (C++20) |
搜尋一組元素中的任何一個 (演算法函式物件) |
| 尋找前兩個相等的(或滿足給定謂詞的)相鄰項 (函式模板) | |
| (C++20) |
尋找前兩個相等的(或滿足給定謂詞的)相鄰項 (演算法函式物件) |
| 回傳滿足特定條件的元素數量 (函式模板) | |
| (C++20)(C++20) |
回傳滿足特定條件的元素數量 (演算法函式物件) |
| 尋找兩個範圍第一個不同之處 (函式模板) | |
| (C++20) |
尋找兩個範圍第一個不同之處 (演算法函式物件) |
| 確定兩組元素是否相同 (函式模板) | |
| (C++20) |
確定兩組元素是否相同 (演算法函式物件) |
| 搜尋某個元素範圍的第一次出現 (函式模板) | |
| (C++20) |
搜尋某個元素範圍的第一次出現 (演算法函式物件) |
| 在範圍中搜尋第一個連續出現指定次數之某個元素的位置 (函式模板) | |
| (C++20) |
在範圍中搜尋第一個連續出現指定次數之某個元素的位置 (演算法函式物件) |
| (C++23) |
檢查一個範圍是否以另一個範圍開始 (演算法函式物件) |
| (C++23) |
檢查一個範圍是否以另一個範圍結束 (演算法函式物件) |
[編輯] 折疊操作 (自 C++23 起)
| 定義於標頭檔
<algorithm> | |
| (C++23) |
對元素範圍進行左折疊 (left-folds) (演算法函式物件) |
| (C++23) |
以第一個元素作為初始值,對元素範圍進行左折疊 (演算法函式物件) |
| (C++23) |
對元素範圍進行右折疊 (right-folds) (演算法函式物件) |
| (C++23) |
以最後一個元素作為初始值,對元素範圍進行右折疊 (演算法函式物件) |
| (C++23) |
對元素範圍進行左折疊,並回傳一個 成對物件 (iterator, value) (演算法函式物件) |
| 以第一個元素作為初始值對範圍進行左折疊,並回傳一個 成對物件 (iterator, optional) (演算法函式物件) | |
[編輯] 修改序列的操作
[編輯] 複製操作
| 定義於標頭檔
<algorithm> | |
| (C++11) |
將範圍內的元素複製到新位置 (函式模板) |
| (C++20)(C++20) |
將範圍內的元素複製到新位置 (演算法函式物件) |
| (C++11) |
複製若干個元素到新位置 (函式模板) |
| (C++20) |
複製若干個元素到新位置 (演算法函式物件) |
| 按逆序複製範圍內的元素 (函式模板) | |
| (C++20) |
按逆序複製範圍內的元素 (演算法函式物件) |
| (C++11) |
將範圍內的元素移動到新位置 (函式模板) |
| (C++20) |
將範圍內的元素移動到新位置 (演算法函式物件) |
| (C++11) |
按逆序將範圍內的元素移動到新位置 (函式模板) |
| (C++20) |
按逆序將範圍內的元素移動到新位置 (演算法函式物件) |
[編輯] 交換操作
| 定義於標頭檔
<string_view> | |
| 交換兩個物件的值 (函式模板) | |
| 定義於標頭檔
<algorithm> | |
| 交換兩個範圍的元素 (函式模板) | |
| (C++20) |
交換兩個範圍的元素 (演算法函式物件) |
| 交換兩個迭代器所指向的元素 (函式模板) | |
[編輯] 轉換操作
| 定義於標頭檔
<algorithm> | |
| 將函式套用於元素範圍,並將結果儲存在目標範圍內 (函式模板) | |
| (C++20) |
對範圍內的元素套用一個函式 (演算法函式物件) |
| 將所有滿足特定條件的值替換為另一個值 (函式模板) | |
| (C++20)(C++20) |
將所有滿足特定條件的值替換為另一個值 (演算法函式物件) |
| 複製範圍,並將滿足特定條件的元素替換為另一個值 (函式模板) | |
| (C++20)(C++20) |
複製範圍,並將滿足特定條件的元素替換為另一個值 (演算法函式物件) |
[編輯] 生成操作
| 定義於標頭檔
<algorithm> | |
| 將給定值複製賦值給範圍內的每個元素 (函式模板) | |
| (C++20) |
為範圍內的元素賦予特定值 (演算法函式物件) |
| 將給定值複製賦值給範圍內的前 N 個元素 (函式模板) | |
| (C++20) |
為若干個元素賦予一個值 (演算法函式物件) |
| 將連續函式呼叫的結果賦值給範圍內的每個元素 (函式模板) | |
| (C++20) |
將函式的結果儲存在範圍內 (演算法函式物件) |
| 將連續函式呼叫的結果賦值給範圍內的前 N 個元素 (函式模板) | |
| (C++20) |
儲存 N 次函式呼叫的結果 (演算法函式物件) |
[編輯] 移除操作
| 定義於標頭檔
<algorithm> | |
| 移除滿足特定條件的元素 (函式模板) | |
| (C++20)(C++20) |
移除滿足特定條件的元素 (演算法函式物件) |
| 複製範圍內的元素,並省略滿足特定條件的元素 (函式模板) | |
| (C++20)(C++20) |
複製範圍內的元素,並省略滿足特定條件的元素 (演算法函式物件) |
| 移除範圍內連續重複的元素 (函式模板) | |
| (C++20) |
移除範圍內連續重複的元素 (演算法函式物件) |
| 建立不包含連續重複元素的範圍副本 (函式模板) | |
| (C++20) |
建立不包含連續重複元素的範圍副本 (演算法函式物件) |
[編輯] 改變順序的操作
| 定義於標頭檔
<algorithm> | |
| 反轉範圍內元素的順序 (函式模板) | |
| (C++20) |
反轉範圍內元素的順序 (演算法函式物件) |
| 建立範圍的反轉副本 (函式模板) | |
| (C++20) |
建立範圍的反轉副本 (演算法函式物件) |
| 旋轉範圍內元素的順序 (函式模板) | |
| (C++20) |
旋轉範圍內元素的順序 (演算法函式物件) |
| 複製並旋轉元素範圍 (函式模板) | |
| (C++20) |
複製並旋轉元素範圍 (演算法函式物件) |
| (C++20) |
平移範圍中的元素 (函式模板) |
| 平移範圍中的元素 (演算法函式物件) | |
| (直到 C++17)(C++11) |
隨機重新排序範圍內的元素 (函式模板) |
| (C++20) |
隨機重新排序範圍內的元素 (演算法函式物件) |
[編輯] 取樣操作
| 定義於標頭檔
<algorithm> | |
| (C++17) |
從序列中隨機選取 N 個元素 (函式模板) |
| (C++20) |
從序列中隨機選取 N 個元素 (演算法函式物件) |
[編輯]
[編輯] 要求
某些演算法要求引數所表示的序列必須是「已排序」或「已分割」的。如果不滿足此要求,其行為是未定義的。
|
若對於指向序列的每個迭代器 iter 以及每個非負整數 n,只要 iter + n[1] 是指向序列中元素的有效迭代器,都有 comp(*(iter + n*iter== false[1],則該序列是相對於比較器 comp 為已排序的。 |
(直到 C++20) |
|
若對於指向序列的每個迭代器 iter 以及每個非負整數 n,只要 iter + n[1] 是指向序列中元素的有效迭代器,bool(std::invoke(comp, std::invoke(proj, *(iter + n, 如果序列相對於比較器 comp 和 std::identity{}(恆等投影)是已排序的,則稱該序列是相對於比較器 comp 為已排序的。 |
(自 C++20 起) |
若存在一個整數 n,使得對於 若對於 若對於 如果範圍相對於比較器 comp 和 std::identity{}(恆等投影)是堆積,則稱該隨機存取範圍為一個相對於比較器 comp 的堆積。 堆積可以透過 std::make_heap 與 ranges::make_heap(自 C++20 起) 來建立。 關於堆積的更多性質,請參閱 最大堆積 (max heap)。
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。[0, std::distance(start, finish)) 內的所有 i,f(*(start + i[1] 為 true 若且唯若 i < n,則序列 [start, finish) 是相對於運算式 f(e
[編輯] 分割操作
<algorithm>
確定範圍是否已按給定謂詞分割
(函式模板)
確定範圍是否已按給定謂詞分割
(演算法函式物件)
將元素範圍分為兩組
(函式模板)
將元素範圍分為兩組
(演算法函式物件)
複製範圍並將元素分為兩組
(函式模板)
複製範圍並將元素分為兩組
(演算法函式物件)
在保持相對順序的同時將元素分為兩組
(函式模板)
在保持相對順序的同時將元素分為兩組
(演算法函式物件)
定位已分割範圍的分割點
(函式模板)
定位已分割範圍的分割點
(演算法函式物件)[編輯] 排序操作
<algorithm>
將範圍按升序排序
(函式模板)
將範圍按升序排序
(演算法函式物件)
對元素範圍進行排序,並保持相等元素之間的順序
(函式模板)
對元素範圍進行排序,並保持相等元素之間的順序
(演算法函式物件)
對範圍的前 N 個元素進行排序
(函式模板)
對範圍的前 N 個元素進行排序
(演算法函式物件)
複製並部分排序元素範圍
(函式模板)
複製並部分排序元素範圍
(演算法函式物件)
檢查範圍是否按升序排序
(函式模板)
檢查範圍是否按升序排序
(演算法函式物件)
尋找最大的已排序子範圍
(函式模板)
尋找最大的已排序子範圍
(演算法函式物件)
部分排序給定範圍,確保其按給定元素分割
(函式模板)
部分排序給定範圍,確保其按給定元素分割
(演算法函式物件)[編輯] 二分搜尋操作 (於已分割的範圍上)
<algorithm>
回傳指向第一個不小於給定值之元素的迭代器
(函式模板)
回傳指向第一個不小於給定值之元素的迭代器
(演算法函式物件)
回傳指向第一個大於特定值之元素的迭代器
(函式模板)
回傳指向第一個大於特定值之元素的迭代器
(演算法函式物件)
回傳與特定鍵相匹配的元素範圍
(函式模板)
回傳與特定鍵相匹配的元素範圍
(演算法函式物件)
判斷某元素是否存在於一個部分排序的範圍中
(函式模板)
判斷某元素是否存在於一個部分排序的範圍中
(演算法函式物件)[編輯] 集合操作 (於已排序的範圍上)
<algorithm>
如果一個序列是另一個序列的子序列,則回傳 true
(函式模板)
如果一個序列是另一個序列的子序列,則回傳 true
(演算法函式物件)
計算兩個集合的聯集
(函式模板)
計算兩個集合的聯集
(演算法函式物件)
計算兩個集合的交集
(函式模板)
計算兩個集合的交集
(演算法函式物件)
計算兩個集合之間的差集
(函式模板)
計算兩個集合之間的差集
(演算法函式物件)
計算兩個集合的對稱差集
(函式模板)
計算兩個集合的對稱差集
(演算法函式物件)[編輯] 合併操作 (於已排序的範圍上)
<algorithm>
合併兩個已排序範圍
(函式模板)
合併兩個已排序範圍
(演算法函式物件)
原地合併兩個有序範圍
(函式模板)
原地合併兩個有序範圍
(演算法函式物件)[編輯] 堆積 (Heap) 操作
(0, last - first) 內的所有整數 i,bool(comp(first[(i - 1/ 2], first[i] 皆為 false,則隨機存取範圍 [first, last) 是一個相對於比較器 comp 的堆積。(直到 C++20)
(0, last - first) 內的所有整數 i,bool(std::invoke(comp, std::invoke(proj, first[(i - 1/ 2] std::invoke(proj, first[i] 皆為 false,則隨機存取範圍 [first, last) 是一個相對於比較器 comp 和投影 proj 的堆積。(自 C++20 起)
<algorithm>
將元素加入最大堆積
(函式模板)
將元素加入最大堆積
(演算法函式物件)
從最大堆積中移除最大的元素
(函式模板)
從最大堆積中移除最大的元素
(演算法函式物件)
從元素範圍中建立一個最大堆積
(函式模板)
從元素範圍中建立一個最大堆積
(演算法函式物件)
將最大堆積轉換為按升序排序的元素範圍
(函式模板)
將最大堆積轉換為按升序排序的元素範圍
(演算法函式物件)
檢查給定範圍是否為最大堆積 (max heap)
(函式模板)
檢查給定範圍是否為最大堆積 (max heap)
(演算法函式物件)
尋找最大的最大堆積子範圍
(函式模板)
尋找最大的最大堆積子範圍
(演算法函式物件)[編輯] 最小值/最大值操作
<algorithm>
回傳給定值中的較大者
(函式模板)
回傳給定值中的較大者
(演算法函式物件)
回傳範圍內最大的元素
(函式模板)
回傳範圍內最大的元素
(演算法函式物件)
回傳給定值中的較小者
(函式模板)
回傳給定值中的較小者
(演算法函式物件)
回傳範圍中的最小元素
(函式模板)
回傳範圍中的最小元素
(演算法函式物件)
回傳兩個元素中的較小值與較大值
(函式模板)
回傳兩個元素中的較小值與較大值
(演算法函式物件)
回傳範圍中的最小與最大元素
(函式模板)
回傳範圍中的最小與最大元素
(演算法函式物件)
將一個值限制在兩邊界值之間
(函式模板)
將一個值限制在兩邊界值之間
(演算法函式物件)[編輯] 字典序比較操作
<algorithm>
如果一個範圍在字典序上小於另一個,則回傳 true
(函式模板)
如果一個範圍在字典序上小於另一個,則回傳 true
(演算法函式物件)
使用三路比較 (three-way comparison) 比較兩個範圍
(函式模板) [編輯] 排列操作
<algorithm>
產生範圍內元素的下一個字典序較大的排列
(函式模板)
產生範圍內元素的下一個字典序較大的排列
(演算法函式物件)
產生範圍內元素的下一個字典序較小的排列
(函式模板)
產生範圍內元素的下一個字典序較小的排列
(演算法函式物件)
判斷一個序列是否為另一個序列的排列
(函式模板)
判斷一個序列是否為另一個序列的排列
(演算法函式物件)[編輯] 數值操作
<numeric>
用起始值的連續遞增值填滿一個範圍
(函式模板)
用起始值的連續遞增值填滿一個範圍
(演算法函式物件)
對元素範圍進行加總或折疊
(函式模板)
計算兩個元素範圍的內積
(函式模板)
計算範圍中相鄰元素之間的差值
(函式模板)
計算元素範圍的部分和 (partial sum)
(函式模板)
類似於 std::accumulate,但計算順序不固定
(函式模板)
類似於 std::partial_sum,但在第 i 個和中排除第 i 個輸入元素
(函式模板)
類似於 std::partial_sum,且在第 i 個和中包含第 i 個輸入元素
(函式模板)
套用可呼叫對象後,再以不固定順序進行歸約 (reduce)
(函式模板)
套用可呼叫對象後,計算不包含目前的掃描 (exclusive scan)
(函式模板)
套用可呼叫對象後,計算包含目前的掃描 (inclusive scan)
(函式模板) [編輯] 在未初始化記憶體上的操作
<memory>
將物件範圍複製到未初始化的記憶體區域
(函式模板)
將物件範圍複製到未初始化的記憶體區域
(演算法函式物件)
將一定數量的物件複製到未初始化的記憶體區域
(函式模板)
將一定數量的物件複製到未初始化的記憶體區域
(演算法函式物件)
將一個物件複製到由範圍定義的未初始化記憶體區域
(函式模板)
將一個物件複製到由範圍定義的未初始化記憶體區域
(演算法函式物件)
將一個物件複製到由起始點和計數定義的未初始化記憶體區域
(函式模板)
將一個物件複製到由起始點和計數定義的未初始化記憶體區域
(演算法函式物件)
將物件範圍移動到未初始化的記憶體區域
(函式模板)
將物件範圍移動到未初始化的記憶體區域
(演算法函式物件)
將一定數量的物件移動到未初始化的記憶體區域
(函式模板)
將一定數量的物件移動到未初始化的記憶體區域
(演算法函式物件)
透過預設初始化 (default-initialization) 在由範圍定義的未初始化記憶體區域中建構物件
(函式模板)
透過預設初始化 (default-initialization) 在由範圍定義的未初始化記憶體區域中建構物件
(演算法函式物件)
透過預設初始化 (default-initialization) 在由起始點和計數定義的未初始化記憶體區域中建構物件
(函式模板)
透過預設初始化 (default-initialization) 在由起始點和計數定義的未初始化記憶體區域中建構物件
(演算法函式物件)
透過值初始化 (value-initialization) 在由範圍定義的未初始化記憶體區域中建構物件
(函式模板)
透過值初始化 (value-initialization) 在由範圍定義的未初始化記憶體區域中建構物件
(演算法函式物件)
透過值初始化 (value-initialization) 在由起始點和計數定義的未初始化記憶體區域中建構物件
(函式模板)
透過值初始化 (value-initialization) 在由起始點和計數定義的未初始化記憶體區域中建構物件
(演算法函式物件)
銷毀一個物件範圍
(函式模板)
銷毀一個物件範圍
(演算法函式物件)
銷毀範圍內的一定數量的物件
(函式模板)
銷毀範圍內的一定數量的物件
(演算法函式物件)
銷毀位於給定地址的物件
(函式模板)
銷毀位於給定地址的物件
(演算法函式物件)
在給定地址建立物件
(函式模板)
在給定地址建立物件
(演算法函式物件)[編輯] 隨機數生成 (自 C++26 起)
<random>
使用均勻隨機位元產生器生成的隨機數填充範圍
(演算法函式物件)[編輯] 註解
功能測試巨集
數值
標準
功能
__cpp_lib_algorithm_iterator_requirements202207L(C++23)
Ranges 迭代器作為非 Ranges 演算法的輸入
__cpp_lib_clamp201603L(C++17)
std::clamp
__cpp_lib_constexpr_algorithms201806L(C++20)
演算法的 constexpr 支援
202306L(C++26)
Constexpr 穩定排序
__cpp_lib_algorithm_default_value_type202403L(C++26)
列表初始化 (List-initialization) 用於演算法
__cpp_lib_freestanding_algorithm202311L(C++26)
<algorithm> 中的獨立實作 (freestanding) 設施
__cpp_lib_robust_nonmodifying_seq_ops201304L(C++14)
使非修改性序列操作更穩健(為 std::mismatch、std::equal 和 std::is_permutation 提供雙範圍多載)
__cpp_lib_sample201603L(C++17)
std::sample
__cpp_lib_shift201806L(C++20)
std::shift_left 和 std::shift_right [編輯] C 標準函式庫
<cstdlib>
對未指定類型的元素範圍進行排序
(函式)
在陣列中搜尋未指定類型的元素
(函式) [編輯] 缺陷報告
DR
應用於
出版時的行為
正確的行為
LWG 193
C++98
堆積 (heap) 要求 *first 為最大元素
可以存在
等於 *first 的元素
LWG 2150
C++98
已排序序列的定義不正確
已修正
LWG 2166
C++98
堆積需求與
最大堆積 (max heap) 的定義不夠匹配需求已改進 [編輯] 參閱