inner_product

版本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 所有运算行为的顺序都有明确规定。

原文地址:https://www.cnblogs.com/Zhoier-Zxy/p/8323982.html