para_cada_n en C++17

La función for_each_n() se agregó en la especificación técnica de C++17. Su idea ha sido tomada del uso de map en Python o Haskel . Esta función se puede llamar con o sin una política de ejecución. La política de ejecución le permite decidir si desea utilizar las nuevas capacidades de paralelización optimizadas para ejecutarse en múltiples núcleos o simplemente ejecutarlas secuencialmente como con los estándares anteriores. Incluso ignore la política de ejecución ya que todas las funciones tienen contrapartes sobrecargadas que se ejecutan secuencialmente. En pocas palabras, for_each_n() ayuda a aplicar una función común a todos los elementos de una array (o cualquier otro tipo de datos lineal). Esencialmente, actualiza por lotes un rango de elementos a partir de un iterador dado y para un número fijo de elementos de ese iterador. 

Sintaxis: 

InputIt for_each_n( ExecutionPolicy&& policy,
           InputIt first, Size n, UnaryFunction f )

policy: [Optional] The execution policy to use.
The function is overloaded without its use.
first: The iterator to the first element 
you want to apply the operation on.
n: the number of elements to apply the function to.
f: the function object that is applied to the elements.  

(Nota: el código proporcionado requiere C++17 o posterior y es posible que no se ejecute en todos los entornos C++17). 

CPP

// Requires C++17 or 17+
// C++ program to demonstrate the use for_each_n
// using function pointers as lambda expressions.
#include <bits/stdc++.h>
using namespace std;
 
/* Helper function to modify each element */
int add1(int x)
{
    return (x + 2);
}
 
int main()
{
    vector<int> arr({ 1, 2, 3, 4, 5, 6 });
 
    // The initial vector
    for (auto i : arr)
        cout << i << " ";
    cout << endl;
 
    // Using function pointer as third parameter
    for_each_n(arr.begin(), 2, add1);
 
    // Print the modified vector
    for (auto i : arr)
        cout << i << " ";
    cout << endl;
 
    // Using lambda expression as third parameter
    for_each_n(arr.begin() + 2, 2, [](auto& x) { x += 2; });
 
    // Print the modified vector
    for (auto i : arr)
        cout << i << " ";
    cout << endl;
 
    return 0;
}

Producción:

1 2 3 4 5 6
2 3 3 4 5 6
2 3 5 6 5 6

El verdadero poder y la flexibilidad de for_each_n() solo se pueden aprovechar mediante el uso de funtores como su tercer argumento. (Nota: el código dado requiere c++17 o posterior y es posible que no se ejecute en todos los entornos c++17). 

CPP

// Requires C++17 or 17+
// A C++ program to demonstrate the use for_each_n
// using functors.
#include <bits/stdc++.h>
using namespace std;
 
// A Functor
class add_del {
private:
    int n;
 
public:
    increment(int _n)
        : n(_n)
    {
    }
 
    // overloading () to create Functor objects
    int operator()(int delta) const
    {
        return n + delta;
    }
};
 
int main()
{
    vector<int> arr({ 1, 2, 3, 4, 5, 6 });
 
    // The initial vector
    for (auto i : arr)
        cout << i << " ";
    cout << endl;
 
    // Using functor as third parameter
    for_each_n(arr.begin(), 2, add_del(1));
    for_each_n(arr.begin() + 2, 2, add_del(2));
 
    // Print the modified vector
    for (auto i : arr)
        cout << i << " ";
    cout << endl;
 
    return 0;
}

Producción:

1 2 3 4 5 6
2 3 5 6 5 6

Publicación traducida automáticamente

Artículo escrito por TuhinPatra 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 *