概述
位于头文件<numeric>。可用来向量化(vectorization)
Returns the result of accumulating init with the inner products of the pairs formed by the elements of two ranges starting at first1 and first2.
The two default operations (to add up the result of multiplying the pairs) may be overridden by the arguments binary_op1 and binary_op2.
返回以从first1和first2开始的两个范围的元素形成的对的内积与init累加的结果。
可以用参数binary_op1和binary_op2覆盖这两个默认操作(将对乘的结果相加)。
函数行为等价如下代码:
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),它包含first1和last1之间的所有元素,包括first1指向的元素,但不包括last1指向的元素。 |
first2 | 第二个序列中的输入迭代器的到初始位置。 范围从first2开始,并具有与上述范围([first1,last1))一样多的元素。 |
init | 累加初始值 |
binary_op1 | 二元运算符,将T类型的两个元素作为参数,并返回累加运算的结果。 这可以是一个函数指针或一个函数对象。 |
binary_op2 | 二元运算符,将T类型的两个元素作为参数,并返回累加运算的结果。 这可以是一个函数指针或一个函数对象。 |
两种操作均不得修改作为其参数传递的任何元素。
第二个运算符处理两个序列中元素形成的对,第一个运算符处理第二个运算符生成的对的结果。(可以记成,第一个运算符格局大一点,统领全局)
init = binary_op1 (init, binary_op2(*first1,*first2));
返回值
init和从first1和first2开始的范围中所有元素对的乘积的累加值。
例
//C++17
#include<iostream>
#include<functional>
#include<numeric>
#include<vector>
using namespace std;
int myPlus(int x, int y) {
return x + y + 1;
}
int myMultiply(int x, int y) {
return 2 * x * y;
}
class myPlus2 {
public:
int operator() (int x, int y) {
return x + y - 1;
}
};
class myMultiply2 {
public:
int operator() (int x, int y) {
return -2 * x * y;
}
};
int main() {
int init = 100;
vector<int> V1 = { 1,2,3,4 };
vector<int> V2 = { 8,7,6,5 };
cout << "default inner_product: ";
cout << inner_product(V1.begin(), V1.end(), V2.begin(), init) << endl;
//160. 100 + 1*8 + 2*7 + 3*6 + 4*5
cout << "using functional operation and lambda expression: ";
cout << inner_product(V1.begin(), V1.end(), V2.begin(), init, plus<int>(),
[](int x, int y) {return (y - x) * (y - x); }) << endl;
//184. 100 + (8-1)^2 + (7-2)^2 + (6-3)^2 + (5-4)^2
cout << "using custom functions: ";
cout << inner_product(V1.begin(), V1.end(), V2.begin(), init, myPlus,
myMultiply) << endl;
//224. 100 + (1*8*2)+1 + (2*7*2)+1 + (3*6*2)+1 + (4*5*2)+1
cout << "using functors: ";
cout << inner_product(V1.begin(), V1.end(), V2.begin(), init, myPlus2(),
myMultiply2()) << endl;
//-24. 100 + (1*8*(-2))-1 + (2*7*(-2))-1 + (3*6*(-2))-1 + (4*5*(-2))-1
}