約束式演算法 (自 C++20 起)
出自 cppreference.com
C++20 提供了 std::ranges 命名空間中大多數演算法的約束式版本。在這些演算法中,範圍可以被指定為迭代器-哨兵對,或者單一的range引數,並且支援投影 (projections) 和指向成員的可呼叫物件 (pointer-to-member callables)。此外,大多數演算法的回傳型別已被修改為回傳在演算法執行期間計算出的所有潛在有用資訊。
目錄 |
[編輯] 演算法函式物件
一個演算法函式物件 (AFO),非正式地稱為niebloid,是一個自訂點物件 (CPO),它被指定為一個或多個重載函式模板。這些函式模板的名稱指定了對應的演算法函式物件。
對於一個演算法函式物件 o,令 S 為其對應的函式模板集合。那麼對於任何引數序列 args...,o(args...) 與 s(args...) 是表達式等價的,其中對 s 進行名稱查找的結果是重載集合 S。
std::ranges 命名空間中的約束式演算法被定義為演算法函式物件。因此
[編輯] 約束式演算法
| 定義於標頭檔
<algorithm> | |
| 定義於命名空間
std::ranges | |
非修改性序列操作 | |
| (C++20)(C++20)(C++20) |
檢查謂詞對範圍中所有、任一或不滿足任何元素是否為 true (演算法函式物件) |
| (C++20) |
將一元函式物件套用於範圍中的元素 (演算法函式物件) |
| (C++20) |
將函式物件套用於序列的前 N 個元素 (演算法函式物件) |
| (C++20)(C++20) |
回傳滿足特定條件的元素數量 (演算法函式物件) |
| (C++20) |
尋找兩個範圍第一個不同之處 (演算法函式物件) |
| (C++20) |
確定兩組元素是否相同 (演算法函式物件) |
| 如果一個範圍在字典序上小於另一個,則回傳 true (演算法函式物件) | |
| (C++20)(C++20)(C++20) |
尋找第一個滿足特定條件的元素 (演算法函式物件) |
| (C++23)(C++23)(C++23) |
尋找最後一個滿足特定條件的元素 (演算法函式物件) |
| (C++20) |
在特定範圍中尋找最後一個元素序列 (演算法函式物件) |
| (C++20) |
搜尋一組元素中的任何一個 (演算法函式物件) |
| (C++20) |
尋找前兩個相等的(或滿足給定謂詞的)相鄰項 (演算法函式物件) |
| (C++20) |
搜尋某個元素範圍的第一次出現 (演算法函式物件) |
| (C++20) |
在範圍中搜尋第一個連續出現指定次數之某個元素的位置 (演算法函式物件) |
| (C++23)(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++20) |
將函式的結果儲存在範圍內 (演算法函式物件) |
| (C++20) |
儲存 N 次函式呼叫的結果 (演算法函式物件) |
| (C++20)(C++20) |
移除滿足特定條件的元素 (演算法函式物件) |
| (C++20)(C++20) |
複製範圍內的元素,並省略滿足特定條件的元素 (演算法函式物件) |
| (C++20)(C++20) |
將所有滿足特定條件的值替換為另一個值 (演算法函式物件) |
| (C++20)(C++20) |
複製範圍,並將滿足特定條件的元素替換為另一個值 (演算法函式物件) |
| (C++20) |
交換兩個範圍的元素 (演算法函式物件) |
| (C++20) |
反轉範圍內元素的順序 (演算法函式物件) |
| (C++20) |
建立範圍的反轉副本 (演算法函式物件) |
| (C++20) |
旋轉範圍內元素的順序 (演算法函式物件) |
| (C++20) |
複製並旋轉元素範圍 (演算法函式物件) |
| (C++20) |
隨機重新排序範圍內的元素 (演算法函式物件) |
| 平移範圍中的元素 (演算法函式物件) | |
| (C++20) |
從序列中隨機選取 N 個元素 (演算法函式物件) |
| (C++20) |
移除範圍內連續重複的元素 (演算法函式物件) |
| (C++20) |
建立不包含連續重複元素的範圍副本 (演算法函式物件) |
分割操作 | |
| (C++20) |
確定範圍是否已按給定謂詞分割 (演算法函式物件) |
| (C++20) |
將元素範圍分為兩組 (演算法函式物件) |
| (C++20) |
複製範圍並將元素分為兩組 (演算法函式物件) |
| (C++20) |
在保持相對順序的同時將元素分為兩組 (演算法函式物件) |
| (C++20) |
定位已分割範圍的分割點 (演算法函式物件) |
排序操作 | |
| (C++20) |
檢查範圍是否按升序排序 (演算法函式物件) |
| (C++20) |
尋找最大的已排序子範圍 (演算法函式物件) |
| (C++20) |
將範圍按升序排序 (演算法函式物件) |
| (C++20) |
對範圍的前 N 個元素進行排序 (演算法函式物件) |
| (C++20) |
複製並部分排序元素範圍 (演算法函式物件) |
| (C++20) |
對元素範圍進行排序,並保持相等元素之間的順序 (演算法函式物件) |
| (C++20) |
部分排序給定範圍,確保其按給定元素分割 (演算法函式物件) |
二分搜尋操作 (於已排序範圍) | |
| (C++20) |
回傳指向第一個不小於給定值之元素的迭代器 (演算法函式物件) |
| (C++20) |
回傳指向第一個大於特定值之元素的迭代器 (演算法函式物件) |
| (C++20) |
判斷某元素是否存在於一個部分排序的範圍中 (演算法函式物件) |
| (C++20) |
回傳與特定鍵相匹配的元素範圍 (演算法函式物件) |
集合操作 (針對已排序範圍) | |
| (C++20) |
合併兩個已排序範圍 (演算法函式物件) |
| (C++20) |
原地合併兩個有序範圍 (演算法函式物件) |
| (C++20) |
如果一個序列是另一個序列的子序列,則回傳 true (演算法函式物件) |
| (C++20) |
計算兩個集合之間的差集 (演算法函式物件) |
| (C++20) |
計算兩個集合的交集 (演算法函式物件) |
| 計算兩個集合的對稱差集 (演算法函式物件) | |
| (C++20) |
計算兩個集合的聯集 (演算法函式物件) |
堆積操作 | |
| (C++20) |
檢查給定範圍是否為最大堆積 (max heap) (演算法函式物件) |
| (C++20) |
尋找最大的最大堆積子範圍 (演算法函式物件) |
| (C++20) |
從元素範圍中建立一個最大堆積 (演算法函式物件) |
| (C++20) |
將元素加入最大堆積 (演算法函式物件) |
| (C++20) |
從最大堆積中移除最大的元素 (演算法函式物件) |
| (C++20) |
將最大堆積轉換為按升序排序的元素範圍 (演算法函式物件) |
最小/最大操作 | |
| (C++20) |
回傳給定值中的較大者 (演算法函式物件) |
| (C++20) |
回傳範圍內最大的元素 (演算法函式物件) |
| (C++20) |
回傳給定值中的較小者 (演算法函式物件) |
| (C++20) |
回傳範圍中的最小元素 (演算法函式物件) |
| (C++20) |
回傳兩個元素中的較小值與較大值 (演算法函式物件) |
| (C++20) |
回傳範圍中的最小與最大元素 (演算法函式物件) |
| (C++20) |
將一個值限制在兩邊界值之間 (演算法函式物件) |
排列操作 | |
| (C++20) |
判斷一個序列是否為另一個序列的排列 (演算法函式物件) |
| (C++20) |
產生範圍內元素的下一個字典序較大的排列 (演算法函式物件) |
| (C++20) |
產生範圍內元素的下一個字典序較小的排列 (演算法函式物件) |
[編輯] 約束式數值操作
| 定義於標頭檔
<numeric> | |
| 定義於命名空間
std::ranges | |
| (C++23) |
用起始值的連續遞增值填滿一個範圍 (演算法函式物件) |
[編輯] 約束式摺疊操作
| 定義於標頭檔
<algorithm> | |
| 定義於命名空間
std::ranges | |
| (C++23) |
對元素範圍進行左折疊 (left-folds) (演算法函式物件) |
| (C++23) |
以第一個元素作為初始值,對元素範圍進行左折疊 (演算法函式物件) |
| (C++23) |
對元素範圍進行右折疊 (right-folds) (演算法函式物件) |
| (C++23) |
以最後一個元素作為初始值,對元素範圍進行右折疊 (演算法函式物件) |
| (C++23) |
對元素範圍進行左折疊,並回傳一個 成對物件 (iterator, value) (演算法函式物件) |
| 以第一個元素作為初始值對範圍進行左折疊,並回傳一個 成對物件 (iterator, optional) (演算法函式物件) | |
[編輯] 約束式未初始化記憶體演算法
| 定義於標頭檔
<memory> | |
| 定義於命名空間
std::ranges | |
| (C++20) |
將物件範圍複製到未初始化的記憶體區域 (演算法函式物件) |
| (C++20) |
將一定數量的物件複製到未初始化的記憶體區域 (演算法函式物件) |
| (C++20) |
將一個物件複製到由範圍定義的未初始化記憶體區域 (演算法函式物件) |
| (C++20) |
將一個物件複製到由起始點和計數定義的未初始化記憶體區域 (演算法函式物件) |
| (C++20) |
將物件範圍移動到未初始化的記憶體區域 (演算法函式物件) |
| (C++20) |
將一定數量的物件移動到未初始化的記憶體區域 (演算法函式物件) |
| 透過預設初始化 (default-initialization) 在由範圍定義的未初始化記憶體區域中建構物件 (演算法函式物件) | |
| 透過預設初始化 (default-initialization) 在由起始點和計數定義的未初始化記憶體區域中建構物件 (演算法函式物件) | |
| 透過值初始化 (value-initialization) 在由範圍定義的未初始化記憶體區域中建構物件 (演算法函式物件) | |
| 透過值初始化 (value-initialization) 在由起始點和計數定義的未初始化記憶體區域中建構物件 (演算法函式物件) | |
| (C++20) |
銷毀一個物件範圍 (演算法函式物件) |
| (C++20) |
銷毀範圍內的一定數量的物件 (演算法函式物件) |
| (C++20) |
銷毀位於給定地址的物件 (演算法函式物件) |
| (C++20) |
在給定地址建立物件 (演算法函式物件) |
[編輯] 約束式亂數演算法
| 定義於標頭檔
<random> | |
| 定義於命名空間
std::ranges | |
| (C++26) |
使用均勻隨機位元產生器生成的隨機數填充範圍 (演算法函式物件) |
[編輯] 回傳型別
| 定義於標頭檔
<algorithm> | |
| 定義於命名空間
std::ranges | |
| (C++20) |
提供一種將迭代器和函式物件儲存為單一單元的方式 (類別模板) |
| (C++20) |
提供一種將兩個迭代器儲存為單一單元的方式 (類別模板) |
| (C++20) |
提供一種將兩個迭代器儲存為單一單元的方式 (類別模板) |
| (C++20) |
提供一種將三個迭代器儲存為單一單元的方式 (類別模板) |
| (C++20) |
提供一種將三個迭代器儲存為單一單元的方式 (類別模板) |
| (C++20) |
提供一種將兩個相同型別的物件或引用儲存為單一單元的方式 (類別模板) |
| (C++20) |
提供一種將迭代器和布林旗標儲存為單一單元的方式 (類別模板) |
| (C++23) |
提供一種將迭代器和值儲存為單一單元的方式 (類別模板) |
| (C++23) |
提供一種將迭代器和值儲存為單一單元的方式 (類別模板) |
[編輯] 附註
| 功能測試巨集 | 數值 | 標準 | 功能 |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403L |
(C++26) | 列表初始化 (List-initialization) 用於演算法 |
__cpp_lib_ranges |
201911L |
(C++20) | 範圍庫與 約束式演算法 |
__cpp_lib_ranges_contains |
202207L |
(C++23) | std::ranges::contains |
__cpp_lib_ranges_find_last |
202207L |
(C++23) | std::ranges::find_last |
__cpp_lib_ranges_fold |
202207L |
(C++23) | std::ranges 摺疊演算法 |
__cpp_lib_ranges_iota |
202202L |
(C++23) | std::ranges::iota |
__cpp_lib_ranges_starts_ends_with |
202106L |
(C++23) | std::ranges::starts_with, std::ranges::ends_with |
__cpp_lib_shift |
201806L |
(C++20) | std::shift_left, std::shift_right |
202202L |
(C++23) | std::ranges::shift_left, std::ranges::shift_right | |
__cpp_lib_ranges_generate_random |
202403L |
(C++26) | std::ranges::generate_random |
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| P3136R1 | C++20 | niebloid 被允許指定為特殊實體 而非函式物件 |
要求指定為函式物件 |