函式模板
<numeric>

std::partial_sum

求和 (1)
template <class InputIterator, class OutputIterator>   OutputIterator partial_sum (InputIterator first, InputIterator last,                               OutputIterator result);
自定義 (2)
template <class InputIterator, class OutputIterator, class BinaryOperation>   OutputIterator partial_sum (InputIterator first, InputIterator last,                               OutputIterator result, BinaryOperation binary_op);
計算範圍內的部分和
將範圍 [first,last) 中對應元素的部分和賦值給目標序列中從 result 開始的每個元素。

如果 x 代表 [first,last) 中的一個元素,y 代表 result 中的一個元素,則 y 可以計算為:

y0 = x0
y1 = x0 + x1
y2 = x0 + x1 + x2
y3 = x0 + x1 + x2 + x3
y4 = x0 + x1 + x2 + x3 + x4
... ... ...

預設操作是累加元素,但也可以指定不同的操作作為 binary_op

此函式模板的行為等同於
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class InputIterator, class OutputIterator>
   OutputIterator partial_sum (InputIterator first, InputIterator last,
                               OutputIterator result)
{
  if (first!=last) {
    typename iterator_traits<InputIterator>::value_type val = *first;
    *result = val;
    while (++first!=last) {
      val = val + *first;   // or: val = binary_op(val,*first)
      *++result = val;
    }
    ++result;
  }
  return result;
}

引數

first, last
輸入迭代器,指向序列的起始和結束位置。使用的範圍是 [first,last),它包含 firstlast 之間的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
result
輸出迭代器,指向目標序列中儲存部分和的起始位置。範圍以 result 開始,並且其大小應足夠容納與上述範圍 ([first,last)) 相同數量的元素。
binary_op
二元操作,接受 InputIterator 指向的型別的兩個元素作為引數,並返回替換求和操作的結果。
這可以是一個函式指標,也可以是一個函式物件。

返回值

指向目標序列中已儲存結果元素的最後一個元素之後位置的迭代器,如果 [first,last) 是一個空範圍,則返回 result

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// partial_sum example
#include <iostream>     // std::cout
#include <functional>   // std::multiplies
#include <numeric>      // std::partial_sum

int myop (int x, int y) {return x+y+1;}

int main () {
  int val[] = {1,2,3,4,5};
  int result[5];

  std::partial_sum (val, val+5, result);
  std::cout << "using default partial_sum: ";
  for (int i=0; i<5; i++) std::cout << result[i] << ' ';
  std::cout << '\n';

  std::partial_sum (val, val+5, result, std::multiplies<int>());
  std::cout << "using functional operation multiplies: ";
  for (int i=0; i<5; i++) std::cout << result[i] << ' ';
  std::cout << '\n';

  std::partial_sum (val, val+5, result, myop);
  std::cout << "using custom function: ";
  for (int i=0; i<5; i++) std::cout << result[i] << ' ';
  std::cout << '\n';
  return 0;
}

輸出

using default partial_sum: 1 3 6 10 15
using functional operation multiplies: 1 2 6 24 120
using custom function: 1 4 8 13 19


複雜度

線性複雜度,與 firstlast 之間的 距離減一成正比(以加法或 binary_op 的應用次數計)。

資料競爭

範圍 [first,last) 中的元素會被訪問(每個物件被訪問一次)。
result 開頭的範圍中的元素會被修改。

異常

如果 binary_op、賦值或迭代器上的操作丟擲異常,則本函式也丟擲異常。
請注意,無效引數會導致未定義行為

另見