Partager via


inner_product

Calcule la somme du produit selon l'élément de plusieurs 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 de somme et de produit binaire sont remplacées par d'autres opérations binaire 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 s'adressant au premier élément dans la première plage dont le produit interne ou le produit interne généralisé avec la deuxième plage doit être calculé.

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

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

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

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

  • _Binary_op2
    L'opération binaire qui remplace l'opération élément par élément de produit interne de multiplication dans la généralisation du produit interne.

Valeur de retour

La première fonction membre retourne la somme des produits élément par élément et l'ajoute à la valeur initiale spécifiée. Pour des plages de valeurs ai et bi, cela retourne :

_Val + ( a1 * b1 ) + ( a2 * b2 ) +

en remplaçant de manière itérative _Val avec _Val + (*ai * *bi ).

La deuxième méthode retourne .

     _Val _Binary_op1 ( a1 _Binary_op2 b1 ) _Binary_op1 ( a2 _Binary_op2 b2 ) _Binary_op1

en remplaçant de manière itérative _Val avec _Val _Binary_op1 (*ai _Binary_op2 *bi ).

Notes

La valeur initiale garantit qu'il y aura un résultat bien défini lorsque la plage est vide, auquel cas _Val est retourné. Les opérations de bits n'ont pas besoin d'être associatives ou commutatives. La plage doit être valide et la complexité est linéaire par rapport à la taille de la plage. Le type de retour de l'opérateur binaire doit être converti en Type pour garantir la fermeture au cours d'une 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>

Espace de noms : std

Voir aussi

Référence

inner_product (Exemples STL)

Bibliothèque STL (Standard Template Library)