std::inner_product

From Cppreference

Jump to: navigation, search
Defined in header <numeric>

template< class InputIterator1, class InputIterator2 class T >

T inner_product( InputIterator1 first1, InputIterator1 last1,

                 InputIterator2 first2, T value );
(1)
template<

    class InputIterator1,
    class InputIterator2,
    class T,
    class BinaryOperation1
    class BinaryOperation2
> T inner_product( InputIterator1 first1, InputIterator1 last1,
                   InputIterator2 first2, T value,
                   BinaryOperation1 op1

                   BinaryOperation2 op2 );
(2)

Computes inner product (i.e. sum of products) of the range [first1, last1) and another range beginning at first2. The first version uses operator* to compute product of the element pairs and operator+ to sum up the products, the second version uses op2 and op1 for these tasks respectively.

Contents

Parameters

first1, last1 - the first range of elements
first2 - the beginning of the second range of elements
init - initial value of the sum of the products
op1 - binary operation function object that will be applied. This function shall compute sum of the values.

The signature of the function should be equivalent to the following:

​Ret fun(const Type1 &a, const Type2 &b);

The signature does not need to have const &.
The type ​Type1​ must be such that an object of type ​T​ can be implicitly converted to ​Type1​. The type ​Type2​ must be such that an object of type ​Ret​ can be dereferenced and then implicitly converted to ​Type2​. The type ​Ret​ must be such that an object of type ​T​ can be assigned a value of type ​Ret​. ​

op2 - binary operation function object that will be applied. This function shall compute product of two values.

The signature of the function should be equivalent to the following:

​Ret fun(const Type1 &a, const Type2 &b);

The signature does not need to have const &.
The types ​Type1​ and ​Type2​ must be such that objects of types ​InputIterator1​ and ​InputIterator2​ can be dereferenced and then implicitly converted to ​Type1​ and ​Type2​ respectively. The type ​Ret​ must be such that an object of type ​Type2​ can be assigned a value of type ​Ret​. ​

Return value

The inner product of two ranges.

Equivalent function

First version:
template<class InputIterator1, class InputIterator2 class T>
T inner_product(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, T value)
{
    while (first1 != last1) {
         value = value + *first1 * *first2;
         ++first1;
         ++first2;
    }
    return value;
}
Second version:
template<
    class InputIterator1,
    class InputIterator2,
    class T,
    class BinaryOperation1
    class BinaryOperation2
> T inner_product(InputIterator1 first1, InputIterator1 last1,
                  InputIterator2 first2, T value,
                  BinaryOperation1 op1
                  BinaryOperation2 op2)
{
    while (first1 != last1) {
         value = op1(value, op2(*first1, *first2));
         ++first1;
         ++first2;
    }
    return value;
}

Example

#include <numeric>
#include <string>
#include <iostream>
#include <vector>
 
int main()
{
    int a[5] = {0, 1, 2, 3, 4}
    int b[5] = {1, 2, 3, 4, 5}
 
    std::vector<int> v1(a, a+5);
    std::vector<int> v2(b, b+5);
 
    //r1 = 0 + 0*1 + 1*2 + 2*3 + 3*4 + 4*5
    int r1 = std::inner_product(v1.begin(), v1.end(), v2.begin(), 0);
    std::cout << r1 << std::endl;
 
    //r2 = 0 + 0*0 + 1*1 + 2*2 + 3*3 + 4*4
    int r2 = std::inner_product(v1.begin(), v1.end(), v1.begin(), 0);
    std::cout << r2 << std::endl;
 
    return 0;
}

Output:

​40
30​

See also

accumulate
sums up a range of elements
(function template)
partial_sum
computes the partial sum of a range of elements
(function template)
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox
In other languages