版本1:
template < class InputIterator1, class InputIterator2, class T> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init) { //以第一序列之元素个数为据,将两个序列都走一遍 for( ; first != last1; ++first1, ++first2) init = init + (*first1 * *first2);//执行两个序列的一般内积 return 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) { //以第一序列之元素个数为据,将两个序列都走一遍 for( ; first != last1; ++first1, ++first2) //以外界提供的仿函数来取代第一版中的operator*和operator+ init = binary_op1(init, binary_op2(*first1, *first2)); return init; }
算法inner_product 能够计算[first,last)和[first2, first2 +( last1 - first1))的一般内积。注意,你一定得提供初值init。这么做的原因之一是当[first,last)为空时,仍可以获得一个明确定义的结果。如果你想计算两个vector的一般内积,应该将 init 设为0。
第一个版本会将两个区间的内积结果加上init。也就是说,现将结果初始化为init,然后针对[ first1,last1 )的每一个迭代器 i ,由头至尾依序执行result = result + ( *i ) * * (first2 + ( i - first ))。
第二个版本与第一版本的唯一差异是以外界提供之仿函数来取代 operator+ 和 operator*。也就是说,首先将结果初始化为init,然后针对[first1,last1)的每一个迭代器i,由头至尾依序执行 result = binary_op1(result, binary_op2(*i, *(first2 + ( i - first1))))。
式中所用的二元仿函数不必满足交换律和结合律。
inner_product 所有运算行为的顺序都有明确规定。