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