STL之inner_product

需要的头文件:
numeric

源码:

//版本1
template <class _InputIterator1, class _InputIterator2, class _Tp>
_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
                  _InputIterator2 __first2, _Tp __init)
{
  for ( ; __first1 != __last1; ++__first1, ++__first2)
    __init = __init + (*__first1 * *__first2);
  return __init;
}
//版本2
template <class _InputIterator1, class _InputIterator2, class _Tp,
          class _BinaryOperation1, class _BinaryOperation2>
_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
                  _InputIterator2 __first2, _Tp __init, 
                  _BinaryOperation1 __binary_op1,
                  _BinaryOperation2 __binary_op2)
{
  for ( ; __first1 != __last1; ++__first1, ++__first2)
    __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
  return __init;
}

作用:
计算[firtst1,last1)和[first2, first2+(last1-first1))的一般内积
通过二元仿函数我们可以取代 operator* 和 operator+

例子:

//请使用比较完整支持c++11特性的编译器进行编译
#include <numeric>
#include <iostream>
#include <vector>
#include <functional>
using namespace std;


int main()
{
    int ia[5] = { 1,2,3,4,5 };
    vector<int> iv(ia, ia + 5);
    int init = 10;
    //计算内积
    //   1  2  3  4  5
    //   *  *  *  *  *
    //   1  2  3  4  5
    // -----------------
// init+ 1+ 4+ 9+ 16+25 = 10+55 =65
    cout << inner_product(iv.begin(), iv.end(), iv.begin(), init) << endl;

    //   1  2  3  
    //   *  *  *  
    //   3  4  5 
    // -----------------
// init+ 3+ 8+ 15 = 10+26 =36
    cout << inner_product(iv.begin(), iv.begin() + 3, iv.begin() + 2, init) << endl;

    //利用仿函数代替operator* 和 operator+
    //   1  2  3  4  5
    //   +  +  +  +  +
    //   1  2  3  4  5
    // -----------------
// init- 1- 4- 9- 16-25 = -20
    cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10, minus<int>(), plus<int>()) << endl;



    return 0;
}

注意:

  • 必须提供一个初始值init,这么做的原因之一是当[first1,last1)为空时,任然可以获得一个明确的值

  • 在使用二元仿函数时,所有运算行为的顺序都有明确的设定

  • 注意binary_op1 和 binary_op2 使用时的区别
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值