std::inner_product en C++

Calcular el producto interno acumulativo del rango 
Devuelve el resultado de acumular init con los productos internos de los pares formados por los elementos de dos rangos comenzando por first1 y first2.
Las dos operaciones predeterminadas (para sumar el resultado de multiplicar los pares) pueden ser anuladas por los argumentos binary_op1 y binary_op2.
1. Usando el producto interno predeterminado: 
Sintaxis: 
 

Template :
T inner_product (InputIterator1 first1, InputIterator1 last1,
                 InputIterator2 first2, T init);

Parameters :

first1, last1
Input iterators to the initial and final positions in the first
sequence.

first2
Input iterator to the initial position in the second sequence.
The range starts at first2 and has as many elements as the range
above [first1, last1].

init
Initial value for the accumulator.

Neither operations shall modify any of the elements passed as
its arguments.

Return Type :
The result of accumulating init and the products of all the pairs
of elements in the ranges starting at first1 and first2.

CPP

// CPP program to illustrate
// std :: inner_product
#include <iostream> // std::cout
#include <functional> // std::minus, std::divides
#include <numeric> // std::inner_product
 
// Driver code
int main()
{
    // The value which is added after
    // finding inner_product b/w elements
    int init = 100;
    int series1[] = { 10, 20, 30 };
    int series2[] = { 1, 2, 3 };
    int n = sizeof(series1) / sizeof(series1[0]);
 
    // Elements in series1
    std::cout << "First array contains :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series1[i];
    std::cout << "\n";
 
    // Elements in series2
    std::cout << "Second array contains :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series2[i];
    std::cout << "\n\n";
 
    std::cout << "Using default inner_product: ";
    std::cout << std::inner_product(series1, series1 + n, series2, init);
    std::cout << '\n';
 
    return 0;
}

Producción: 
 

First array contains : 10 20 30
Second array contains : 1 2 3

Using default inner_product: 240

2. Usando la operación funcional: 
Sintaxis: 
 

Template :
T inner_product (InputIterator1 first1, InputIterator1 last1,
                 InputIterator2 first2, T init,
                 BinaryOperation1 binary_op1,
                 BinaryOperation2 binary_op2);

Parameters :

first1, last1, first2, init are same as above.

binary_op1
Binary operation taking two elements of type T as arguments, and
returning the result of an accumulation operation.
This can either be a function pointer or a function object.

binary_op2
Binary operation taking two elements of type T as arguments, and
returning the result of the inner product operation.
This can either be a function pointer or a function object.

Here binary_op1 and binary_op2 are functional operation.

Neither operations shall modify any of the elements passed as
its arguments.

Return Type :
The result of accumulating init and the products of all the pairs
of elements in the ranges starting at first1 and first2.

CPP

// CPP program to illustrate
// std :: inner_product
#include <iostream> // std::cout
#include <functional> // std::minus, std::divides
#include <numeric> // std::inner_product
 
// Driver code
int main()
{
    // The value which is added after
    // finding inner_product b/w elements
    int init = 100;
    int series1[] = { 10, 20, 30 };
    int series2[] = { 1, 2, 3 };
    int n = sizeof(series1) / sizeof(series1[0]);
 
    // Elements in series1
    std::cout << "First array contains :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series1[i];
    std::cout << "\n";
 
    // Elements in series2
    std::cout << "Second array contains :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series2[i];
    std::cout << "\n\n";
 
    std::cout << "Using functional operations: ";
    // std :: minus returns the difference b/w
    // each elements of both array
    // std :: divides return the quotient of
    // each elements of both array after performing
    // divide operation
    // The operations is performed b/w number of same index
    // of both array
    std::cout << std::inner_product(series1, series1 + n, series2, init,
                                    std::minus<int>(), std::divides<int>());
    std::cout << '\n';
 
    return 0;
}

Producción: 
 

First array contains : 10 20 30
Second array contains : 1 2 3

Using functional operations: 70

3. Uso de funciones personalizadas: 
Sintaxis: 
 

Template :
T inner_product (InputIterator1 first1, InputIterator1 last1,
                 InputIterator2 first2, T init,
                 BinaryOperation1 binary_op1,
                 BinaryOperation2 binary_op2);

Parameters :

first1, last1, first2, init are same as above.

binary_op1
Binary operation taking two elements of type T as arguments, and
returning the result of an accumulation operation.
This can either be a function pointer or a function object.

binary_op2
Binary operation taking two elements of type T as arguments, and
returning the result of the inner product operation.
This can either be a function pointer or a function object.

Neither operations shall modify any of the elements passed as
its arguments.

Return Type :
The result of accumulating init and the products of all the pairs
of elements in the ranges starting at first1 and first2.

CPP

// CPP program to illustrate
// std :: inner_product
#include <iostream> // std::cout
#include <functional> // std::minus, std::divides
#include <numeric> // std::inner_product
 
// Custom functions
int myaccumulator(int x, int y)
{
    return x - y;
}
int myproduct(int x, int y)
{
    return x + y;
}
 
// Driver code
int main()
{
    // The value which is added after
    // finding inner_product b/w elements
    int init = 100;
    int series1[] = { 10, 20, 30 };
    int series2[] = { 1, 2, 3 };
    int n = sizeof(series1) / sizeof(series1[0]);
 
    // Elements in series1
    std::cout << "First array contains :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series1[i];
    std::cout << "\n";
 
    // Elements in series2
    std::cout << "Second array contains :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series2[i];
    std::cout << "\n\n";
 
    std::cout << "Using custom functions: ";
    std::cout << std::inner_product(series1, series1 + 3, series2, init,
                                    myaccumulator, myproduct);
    std::cout << '\n';
 
    return 0;
}

Producción: 
 

First array contains : 10 20 30
Second array contains : 1 2 3

Using custom functions: 34

NOTA: 
Al usar el valor funcional y la función personalizada , podemos realizar la operación cambiando el operador (o usando un valor funcional diferente) en esta función STL.
Posible Aplicación: Devuelve el resultado de acumular init con los productos internos del par formado por los elementos de dos rangos comenzando por first1 y first2.
1. Se puede usar para encontrar la suma de los productos del i-ésimo índice de ambas arrays. 
Por ejemplo: 
Array 1: 1 2 3 4 
Array 2: 10 20 30 40
Suma de productos: 300
Explicación: 1 * 10 + 2 * 20 + 3 * 30 + 4 * 40 = 300 
 

CPP

// CPP program to illustrate
// std :: inner_product
#include <iostream> // std::cout
#include <functional> // std::minus, std::divides
#include <numeric> // std::inner_product
 
// Custom functions
int myaccumulator(int x, int y)
{
    return x + y;
}
int myproduct(int x, int y)
{
    return x * y;
}
 
// Driver code
int main()
{
    // The value which is added after
    // finding inner_product b/w elements
    int init = 0;
    int series1[] = { 1, 2, 3, 4 };
    int series2[] = { 10, 20, 30, 40 };
    int n = sizeof(series1) / sizeof(series1[0]);
 
    // Elements in series1
    std::cout << "Array 1 :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series1[i];
    std::cout << "\n";
 
    // Elements in series2
    std::cout << "Array 2 :";
    for (int i = 0; i < n; i++)
        std::cout << " " << series2[i];
    std::cout << "\n\n";
 
    std::cout << "Sum of products : ";
    std::cout << std::inner_product(series1, series1 + n, series2, init,
                                    myaccumulator, myproduct);
    std::cout << '\n';
 
    return 0;
}

PRODUCCIÓN : 
 

Array 1 : 1 2 3 4
Array 2 : 10 20 30 40

Sum of products : 300

También podemos encontrar la diferencia de productos, o la suma de la división, o la diferencia de la división y más, todo cambiando el operador.
Este artículo es una contribución de Sachin Bisht . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *