stlab.adobe.com Adobe Systems Incorporated

inner_product

algorithms.gif
function.gif
Category: algorithms Component type: function

Prototype

Inner_product is an overloaded name; there are actually two inner_product functions.

template <class InputIterator1, class InputIterator2, class T>
T inner_product(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, T init);

template <class InputIterator1, class InputIterator2, class T,
          class BinaryFunction1, class BinaryFunction2>
T inner_product(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, T init, BinaryFunction1 binary_op1,
                BinaryFunction2 binary_op2);

Description

Inner_product calculates a generalized inner product of the ranges [first1, last1) and [first2, last2).

The first version of inner_product returns init plus the inner product of the two ranges [1]. That is, it first initializes the result to init and then, for each iterator i in [first1, last1), in order from the beginning to the end of the range, updates the result by result = result + (*i) *(first2 + (i - first1)).

The second version of inner_product is identical to the first, except that it uses two user-supplied functors instead of operator+ and operator*. That is, it first initializes the result to init and then, for each iterator i in [first1, last1), in order from the beginning to the end of the range, updates the result by result = binary_op1(result, binary_op2(*i, *(first2 + (i - first1))). [2]

Definition

Defined in the standard header numeric, and in the nonstandard backward-compatibility header algo.h.

Requirements on types

For the first version:

  • InputIterator1 is a model of InputIterator.
  • InputIterator2 is a model of InputIterator.
  • T is a model of Assignable.
  • If x is an object of type T, y is an object of InputIterator1's value type, and z is an object of InputIterator2's value type, then x + y * z is defined.
  • The type of x + y * z is convertible to T.

For the second version:

  • InputIterator1 is a model of InputIterator.
  • InputIterator2 is a model of InputIterator.
  • T is a model of Assignable.
  • BinaryFunction1 is a model of BinaryFunction.
  • BinaryFunction2 is a model of BinaryFunction.
  • InputIterator1's value type is convertible to BinaryFunction2's first argument type.
  • InputIterator2's value type is convertible to BinaryFunction2's second argument type.
  • T is convertible to BinaryFunction1's first argument type.
  • BinaryFunction2's return type is convertible to BinaryFunction1's second argument type.
  • BinaryFunction1's return type is convertible to T.

Preconditions

  • [first1, last1) is a valid range.
  • [first2, first2 + (last1 - first1)) is a valid range.

Complexity

Linear. Exactly last1 - first1 applications of each binary operation.

Example

int main()
{
  int A1[] = {1, 2, 3};
  int A2[] = {4, 1, -2};
  const int N1 = sizeof(A1) / sizeof(int);

  cout << "The inner product of A1 and A2 is " 
       << inner_product(A1, A1 + N1, A2, 0)
       << endl;
}

Notes

[1] There are several reasons why it is important that inner_product starts with the value init. One of the most basic is that this allows inner_product to have a well-defined result even if [first1, last1) is an empty range: if it is empty, the return value is init. The ordinary inner product corresponds to setting init to 0.

[2] Neither binary operation is required to be either associative or commutative: the order of all operations is specified.

See also

accumulate, partial_sum, adjacent_difference, count

Copyright © 2006-2007 Adobe Systems Incorporated.

Use of this website signifies your agreement to the Terms of Use and Online Privacy Policy.

Search powered by Google