受限演算法 (C++20 起)
來自 cppreference.com
C++20 在 std::ranges
名稱空間中提供了大多數演算法的受限版本。在這些演算法中,範圍可以指定為迭代器-哨兵對,或者單個範圍
引數,並支援投影和成員指標可呼叫物件。此外,大多數演算法的返回型別已更改為返回演算法執行期間計算的所有潛在有用資訊。
目錄 |
[編輯] 演算法函式物件
一個 演算法函式物件 (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) |
在一個範圍內搜尋一個元素的連續 N 次副本首次出現的位置 (演算法函式物件) |
(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) |
檢查給定的範圍是否是一個最大堆 (演算法函式物件) |
(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) |
對一個範圍的元素進行左摺疊 (演算法函式物件) |
(C++23) |
使用第一個元素作為初始值對一個範圍的元素進行左摺疊 (演算法函式物件) |
(C++23) |
對一個範圍的元素進行右摺疊 (演算法函式物件) |
(C++23) |
使用最後一個元素作為初始值對一個範圍的元素進行右摺疊 (演算法函式物件) |
(C++23) |
對一個範圍的元素進行左摺疊,並返回一個 pair (迭代器, 值) (演算法函式物件) |
使用第一個元素作為初始值對元素範圍進行左摺疊,並返回一個pair(迭代器,optional) (演算法函式物件) |
[編輯] 受限未初始化記憶體演算法
定義於標頭檔案
<memory> | |
定義於名稱空間
std::ranges | |
(C++20) |
將物件範圍複製到未初始化記憶體區域 (演算法函式物件) |
(C++20) |
將一定數量的物件複製到未初始化記憶體區域 (演算法函式物件) |
(C++20) |
將物件複製到由範圍定義的未初始化記憶體區域 (演算法函式物件) |
(C++20) |
將物件複製到由起始和計數定義的未初始化記憶體區域 (演算法函式物件) |
(C++20) |
將一系列物件移動到未初始化記憶體區域 (演算法函式物件) |
(C++20) |
將多個物件移動到未初始化記憶體區域 (演算法函式物件) |
透過預設初始化在由範圍定義的未初始化記憶體區域中構造物件 (演算法函式物件) | |
透過預設初始化在由起始和計數定義的未初始化記憶體區域中構造物件 (演算法函式物件) | |
在由範圍定義的未初始化記憶體區域中,透過值初始化構造物件 (演算法函式物件) | |
在由起始和計數定義的未初始化記憶體區域中,透過值初始化構造物件 (演算法函式物件) | |
(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) | 演算法的列表初始化 |
__cpp_lib_ranges |
201911L |
(C++20) | Ranges 庫和受限演算法 |
__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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
P3136R1 | C++20 | niebloid 曾被允許指定為特殊實體 而不是函式物件 |
要求指定為函式物件 |