Partager via


inner_product

Calcule la somme du produit en ce qui concerne l'élément de deux plages et l'ajoute à une valeur initiale spécifiée ou calcule le résultat d'une procédure généralisée où les opérations binaires de somme et de produit sont remplacées par d'autres opérations binaires spécifiées.

template<class InputIterator1, class InputIterator2, class Type>
   Type inner_product(
      InputIterator1 _First1, 
      InputIterator1 _Last1,
      InputIterator2 _First2, 
      Type _Val
   );

template<class InputIterator1, class InputIterator2, class Type,
   class BinaryOperation1, class BinaryOperation2>
   Type inner_product(
      InputIterator1 _First1, 
      InputIterator1 _Last1,
      InputIterator2 _First2, 
      Type _Val, 
      BinaryOperation1 _Binary_op1, 
      BinaryOperation2 _Binary_op2
   );

Paramètres

  • _First1
    Un itérateur d'entrée adressant le premier élément de la première plage dont le produit interne ou le produit généralisé interne avec le deuxième intervalle est être calculée.

  • _Last1
    Un itérateur d'entrée adressant le dernier élément de la première plage dont le produit interne ou le produit généralisé interne avec le deuxième intervalle est être calculée.

  • _First2
    Un itérateur d'entrée adressant le premier élément du deuxième intervalle dont le produit interne ou le produit généralisé interne avec la première plage est être calculée.

  • _Val
    Une valeur initiale à laquelle le produit interne ou le produit généralisé interne entre les plages doit être ajouté.

  • _Binary_op1
    L'opération binaire qui remplace l'exécution de produit interne de la somme est appliquée aux produits en ce qui concerne l'élément dans la généralisation du produit interne.

  • _Binary_op2
    L'opération binaire qui remplace l'exécution en ce qui concerne l'élément de produit interne se multiplient dans la généralisation du produit interne.

Valeur de retour

La première fonction membre retourne la somme des produits en ce qui concerne l'élément et ajoute à son la valeur initiale spécifiée.Ainsi pour les plages de valeurs AIet le Bi, elle retourne :

_Val + (* a1*b)1 + (* a2b)*2 +

en remplaçant de manière itérative _Val par _Val + (*ai * *b)i .

Le deuxième retour de la fonction membre :

     _Val _Binary_op1 (un1*_Binary_op2b1 ) _Binary_op1 (un2_Binary_op2b*2 ) _Binary_op1

en remplaçant de manière itérative _Val par _Val _Binary_op1 (*b) de *ai _Binary_op2i .

Notes

La valeur initiale garantit qu'il y aura un résultat bien défini lorsque la plage est vide, dans ce cas _Val est retourné.Les opérations binaires n'ont pas besoin d'être associatives ou commutatives.L'intervalle doit être valide et la complexité est linéaire à la taille de la plage.Le type de retour de l'opérateur binaire doit être convertible à Type pour garantir la fermeture pendant l'itération.

Exemple

// numeric_inner_prod.cpp
// compile with: /EHsc
#include <vector>
#include <list>
#include <numeric>
#include <functional>
#include <iostream>

int main()
{
   using namespace std;

   vector <int> v1, v2(7), v3(7);
   vector <int>::iterator iter1, iter2, iter3;

   int i;
   for (i = 1; i <= 7; i++)
   {
      v1.push_back(i);
   }

   cout << "The original vector v1 is:\n ( " ;
   for (iter1 = v1.begin(); iter1 != v1.end(); iter1++)
      cout << *iter1 << " ";
   cout << ")." << endl;

   list <int> l1, l2(7);
   list <int>::iterator lIter1, lIter2;

   int t;
   for (t = 1; t <= 7; t++)
   {
      l1.push_back(t);
   }

   cout << "The original list l1 is:\n ( " ;
   for (lIter1 = l1.begin(); lIter1 != l1.end(); lIter1++)
      cout << *lIter1 << " ";
   cout << ")." << endl;

   // The first member function for the inner product
   int inprod;
   inprod = inner_product(v1.begin(), v1.end(), l1.begin(), 0);

   cout << "The inner_product of the vector v1 and the list l1 is: "
        << inprod << "." << endl;

   // Constructing a vector of partial inner_products between v1 & l1
   int j = 0, parinprod;
   for (iter1 = v1.begin(); iter1 != v1.end(); iter1++) {
      parinprod = inner_product(v1.begin(), iter1 + 1, l1.begin(), 0);
      v2[j] = parinprod;
      j++;
   }

   cout << "Vector of partial inner_products between v1 & l1 is:\n ( " ;
   for (iter2 = v2.begin(); iter2 != v2.end(); iter2++)
      cout << *iter2 << " ";
   cout << ")." << endl << endl;

   // The second member function used to compute
   // the product of the element-wise sums
   int inprod2;
   inprod2 = inner_product (v1.begin(), v1.end(),
      l1.begin(), 1, multiplies<int>(), plus<int>());

   cout << "The sum of the element-wise products of v1 and l1 is: "
        << inprod2 << "." << endl;

   // Constructing a vector of partial sums of element-wise products
   int k = 0, parinprod2;
   for (iter1 = v1.begin(); iter1 != v1.end(); iter1++)
   {
      parinprod2 =
         inner_product(v1.begin(), iter1 + 1, l1.begin(), 1,
         multiplies<int>(), plus<int>());
      v3[k] = parinprod2;
      k++;
   }

   cout << "Vector of partial sums of element-wise products is:\n ( " ;
   for (iter3 = v3.begin(); iter3 != v3.end(); iter3++)
      cout << *iter3 << " ";
   cout << ")." << endl << endl;
}

Sortie

The original vector v1 is:
 ( 1 2 3 4 5 6 7 ).
The original list l1 is:
 ( 1 2 3 4 5 6 7 ).
The inner_product of the vector v1 and the list l1 is: 140.
Vector of partial inner_products between v1 & l1 is:
 ( 1 5 14 30 55 91 140 ).

The sum of the element-wise products of v1 and l1 is: 645120.
Vector of partial sums of element-wise products is:
 ( 2 8 48 384 3840 46080 645120 ).

Configuration requise

en-tête : <numeric>

l'espace de noms : DST

Voir aussi

Référence

inner_product (STL Samples)

Modèles Standard