函数模板
<numeric>

std::inner_product

sum/multiply (1)
template <class InputIterator1, class InputIterator2, class T>   T inner_product (InputIterator1 first1, InputIterator1 last1,                    InputIterator2 first2, T init);
自定义 (2)
template <class InputIterator1, class InputIterator2, class T,          class BinaryOperation1, class BinaryOperation2>   T inner_product (InputIterator1 first1, InputIterator1 last1,                    InputIterator2 first2, T init,                    BinaryOperation1 binary_op1,                    BinaryOperation2 binary_op2);
计算范围的累积内积
返回将 init 与两个范围(从 first1first2 开始)的元素对的内积累加起来的结果。

默认的两个操作(将乘积对累加)可以通过参数 binary_op1binary_op2 进行覆盖。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
10
11
template <class InputIterator1, class InputIterator2, class T>
   T inner_product (InputIterator1 first1, InputIterator1 last1,
                    InputIterator2 first2, T init)
{
  while (first1!=last1) {
    init = init + (*first1)*(*first2);
               // or: init = binary_op1 (init, binary_op2(*first1,*first2));
    ++first1; ++first2;
  }
  return init;
}

参数

first1, last1
输入迭代器 指向第一个序列的初始和末尾位置。使用的范围是 [first1,last1),它包含 first1last1 之间的所有元素,包括 first1 指向的元素,但不包括 last1 指向的元素。
first2
输入迭代器 指向第二个序列的初始位置。该范围从 first2 开始,并且包含与上面范围([first1,last1))相同数量的元素。
init
累加器的初始值。
binary_op1
二元操作,接受两个类型为 T 的元素作为参数,并返回累加操作的结果。
这可以是一个函数指针或一个函数对象。
binary_op2
二元操作,接受两个类型为 T 的元素作为参数,并返回内积操作的结果。
这可以是一个函数指针或一个函数对象。
两个操作都不应修改其作为参数传递的任何元素。

返回值

累加 init 和来自 first1first2 开始的范围内的所有元素对的乘积的结果。

示例

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
28
29
// inner_product example
#include <iostream>     // std::cout
#include <functional>   // std::minus, std::divides
#include <numeric>      // std::inner_product

int myaccumulator (int x, int y) {return x-y;}
int myproduct (int x, int y) {return x+y;}

int main () {
  int init = 100;
  int series1[] = {10,20,30};
  int series2[] = {1,2,3};

  std::cout << "using default inner_product: ";
  std::cout << std::inner_product(series1,series1+3,series2,init);
  std::cout << '\n';

  std::cout << "using functional operations: ";
  std::cout << std::inner_product(series1,series1+3,series2,init,
                                  std::minus<int>(),std::divides<int>());
  std::cout << '\n';

  std::cout << "using custom functions: ";
  std::cout << std::inner_product(series1,series1+3,series2,init,
                                  myaccumulator,myproduct);
  std::cout << '\n';

  return 0;
}

输出

using default inner_product: 240
using functional operations: 70
using custom functions: 34


复杂度

线性时间复杂度,与 first1last1 之间的距离成比例。

数据竞争

两个范围内的元素都会被访问(每个元素被访问一次)。

异常

如果对元素或迭代器的任何操作抛出异常,则此函数也抛出异常。
请注意,无效参数会导致未定义行为

另见