inner_product

本文深入解析了C++标准库中的inner_product算法,详细介绍了其两种版本的实现方式,包括基本运算和使用自定义二元操作符进行计算的过程。阐述了如何通过初始化值处理空序列情况,并强调了算法中仿函数使用的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版本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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值