std::inclusive_scan
定義於標頭檔案 <numeric> |
||
template< class InputIt, class OutputIt > OutputIt inclusive_scan( InputIt first, InputIt last, |
(1) | (C++17 起) (C++20 起為 constexpr) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > |
(2) | (C++17 起) |
template< class InputIt, class OutputIt, class BinaryOp > OutputIt inclusive_scan( InputIt first, InputIt last, |
(3) | (C++17 起) (C++20 起為 constexpr) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryOp > |
(4) | (C++17 起) |
template< class InputIt, class OutputIt, class BinaryOp, class T > |
(5) | (C++17 起) (C++20 起為 constexpr) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, |
(6) | (C++17 起) |
[
0,
std::distance(first, last))
中的每個整數 i,按順序執行以下操作:- 建立一個序列,該序列由
[
first,
iter]
中的元素按順序組成,其中 iter 是 first 的第 i 個迭代器。 - 計算序列在 op 上的廣義非交換和。
- 將結果賦值給 *dest,其中 dest 是 d_first 的第 i 個迭代器。
[
first,
iter]
中的元素按順序組成。
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> 為 true。 |
(C++20 前) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> 為 true。 |
(C++20 起) |
一個元素序列在二元操作 binary_op 上的廣義非交換和定義如下:
- 如果序列只有一個元素,則和就是該元素的值。
- 否則,按順序執行以下操作:
- 從序列中選擇任意兩個相鄰元素 elem1 和 elem2。
- 計算 binary_op(elem1, elem2) 並用結果替換序列中的這兩個元素。
- 重複步驟 1 和 2,直到序列中只剩下一個元素。
給定 binary_op 作為實際的二元操作,
- 如果 binary_op 不滿足結合律(例如浮點加法),則結果是不確定的。
- 對於過載 (1-4),如果 binary_op(*first, *first) 不能轉換為 decltype(first) 的值型別,則程式格式錯誤。
- 對於過載 (5,6),如果以下任何值不能轉換為
T
,則程式格式錯誤:
- binary_op(init, *first)
- binary_op(init, init)
- binary_op(*first, *first)
- 如果滿足以下任何條件,則行為是未定義的:
- 對於過載 (1-4),decltype(first) 的值型別不是 可移動構造的(MoveConstructible)。
- 對於過載 (5,6),
T
不是 可移動構造的(MoveConstructible)。 - binary_op 修改
[
first,
last)
中的任何元素。 - binary_op 使
[
first,
last]
的任何迭代器或子範圍失效。
目錄 |
[編輯] 引數
first, last | - | 定義要求和的元素源範圍的迭代器對 |
d_first | - | 目標範圍的起始;可能等於 first |
policy | - | 要使用的 執行策略 |
init | - | 初始值 |
op | - | 二元函式物件(FunctionObject),將應用於解引用輸入迭代器的結果、其他 op 的結果以及 init(如果提供) |
型別要求 | ||
-InputIt 必須滿足 LegacyInputIterator 的要求。 | ||
-OutputIt 必須滿足 LegacyOutputIterator 的要求。 | ||
-ForwardIt1, ForwardIt2 必須滿足 舊式前向迭代器(LegacyForwardIterator) 的要求。 |
[編輯] 返回值
指向最後一個寫入元素之後的元素的迭代器。
[編輯] 複雜度
給定 N 作為 std::distance(first, last)
[編輯] 異常
帶有模板引數 ExecutionPolicy
的過載按如下方式報告錯誤
- 如果作為演算法一部分呼叫的函式執行時丟擲異常且
ExecutionPolicy
是標準策略之一,則呼叫 std::terminate。對於任何其他ExecutionPolicy
,行為由實現定義。 - 如果演算法未能分配記憶體,則丟擲 std::bad_alloc。
[編輯] 示例
#include <functional> #include <iostream> #include <iterator> #include <numeric> #include <vector> int main() { std::vector data{3, 1, 4, 1, 5, 9, 2, 6}; std::cout << "Exclusive sum: "; std::exclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "), 0); std::cout << "\nInclusive sum: "; std::inclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << "\n\nExclusive product: "; std::exclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "), 1, std::multiplies<>{}); std::cout << "\nInclusive product: "; std::inclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "), std::multiplies<>{}); }
輸出
Exclusive sum: 0 3 4 8 9 14 23 25 Inclusive sum: 3 4 8 9 14 23 25 31 Exclusive product: 1 3 3 12 12 60 540 1080 Inclusive product: 3 3 12 12 60 540 1080 6480
[編輯] 參閱
計算一個範圍內相鄰元素之間的差值 (函式模板) | |
對一個範圍的元素進行求和或摺疊 (函式模板) | |
計算一個範圍元素的部分和 (函式模板) | |
(C++17) |
應用一個可呼叫物件,然後計算包含掃描 (函式模板) |
(C++17) |
類似於 std::partial_sum,將第 i 個輸入元素從第 i 個和中排除 (函式模板) |