bucle for_each en C++

Aparte de las técnicas genéricas de looping , como “for, while y do-while”, C++ en su lenguaje también nos permite utilizar otra funcionalidad que resuelve el mismo propósito denominada loops “for-each”. Este bucle acepta una función que se ejecuta sobre cada uno de los elementos del contenedor. Este ciclo se define en el archivo de encabezado «algoritmo»: #include<algoritmo> y, por lo tanto, debe incluirse para que este ciclo funcione correctamente.

  • Es versátil, es decir, puede funcionar con cualquier contenedor.
  • Reduce las posibilidades de errores que uno puede cometer usando genérico for loop
  • Hace que el código sea más legible.
  • los bucles for_each mejoran el rendimiento general del código
  •  

Sintaxis:  

for_each (InputIterator start_iter, InputIterator last_iter, Function fnc)

start_iter : The beginning position 
from where function operations has to be executed.
last_iter : The ending position 
till where function has to be executed.
fnc/obj_fnc : The 3rd argument is a function or 
an object function which operation would be applied to each element. 

CPP

// C++ code to demonstrate the
// working of for_each loop
 
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
 
// helper function 1
void printx2(int a)
{
    cout << a * 2 << " ";
}
 
// helper function 2
// object type function
struct Class2
{
    void operator() (int a)
    {
        cout << a * 3 << " ";
    }
} ob1;
 
 
int main()
{
     
    // initializing array
    int arr[5] = { 1, 5, 2, 4, 3 };
     
    cout << "Using Arrays:" << endl;
     
    // printing array using for_each
    // using function
    cout << "Multiple of 2 of elements are : ";
    for_each(arr, arr + 5, printx2);
     
    cout << endl;
     
    // printing array using for_each
    // using object function
    cout << "Multiple of 3 of elements are : ";
    for_each(arr, arr + 5, ob1);
     
    cout << endl;
     
    // initializing vector
    vector<int> arr1 = { 4, 5, 8, 3, 1 };
     
    cout << "Using Vectors:" << endl;
     
     
    // printing array using for_each
    // using function
    cout << "Multiple of 2 of elements are : ";
    for_each(arr1.begin(), arr1.end(), printx2);
     
    cout << endl;
     
    // printing array using for_each
    // using object function
    cout << "Multiple of 3 of elements are : ";
    for_each(arr1.begin(), arr1.end(), ob1);
     
    cout << endl;
     
}
Producción

Using Arrays:
Multiple of 2 of elements are : 2 10 4 8 6 
Multiple of 3 of elements are : 3 15 6 12 9 
Using Vectors:
Multiple of 2 of elements are : 8 10 16 6 2 
Multiple of 3 of elements are : 12 15 24 9 3 

Excepciones y for_each:

En los casos de excepciones, si la función arroja una excepción o si alguna de las operaciones en los iteradores arroja una excepción, el bucle for_each también arrojará una excepción y romperá/terminará el bucle. 

Nota: 

  • Los argumentos no válidos pueden conducir a un comportamiento indefinido .
  • For_each no puede funcionar con punteros de una array (un puntero de array no conoce su tamaño, los bucles for_each no funcionarán con arrays sin conocer el tamaño de una array)

CPP

// C++ code to demonstrate the working
// of for_each with Exception
 
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
 
// Helper function 1
void printx2(int a)
{
    cout << a * 2 << " ";
    if ( a % 2 == 0)
    {
        throw a;
    }
     
}
 
// Helper function 2
// object type function
struct Class2
{
    void operator() (int a)
    {
        cout << a * 3 << " ";
        if ( a % 2 == 0)
        {
            throw a;
             
        }
    }
} ob1;
 
 
int main()
{
     
    // Initializing array
    int arr[5] = { 1, 5, 2, 4, 3 };
     
    cout << "Using Array" << endl;
     
    // Printing Exception using for_each
    // using function
    try
    {
        for_each(arr, arr + 5, printx2);
    }
    catch(int i)
    {
        cout << "\nThe Exception element is : " << i ;
    }
    cout << endl;
     
    // Printing Exception using for_each
    // using object function
    try
    {
        for_each(arr, arr + 5, ob1);
    }
    catch(int i)
    {
        cout << "\nThe Exception element is : " << i ;
    }
     
    // Initializing vector
    vector<int> arr1 = { 1, 3, 6, 5, 1 };
     
    cout << "\nUsing Vector" << endl;
     
    // Printing Exception using for_each
    // using function
    try
    {
        for_each(arr1.begin(), arr1.end(), printx2);
    }
    catch(int i)
    {
        cout << "\nThe Exception element is : " << i ;
    }
    cout << endl;
     
    // printing Exception using for_each
    // using object function
    try
    {
        for_each(arr1.begin(), arr1.end(), ob1);
    }
    catch(int i)
    {
        cout << "\nThe Exception element is : " << i ;
    }
}
Producción

Using Array
2 10 4 
The Exception element is : 2
3 15 6 
The Exception element is : 2
Using Vector
2 6 12 
The Exception element is : 6
3 9 18 
The Exception element is : 6

Usando lambdas:

Con la introducción de funciones lambda, esto se puede usar fácilmente para hacer que todo esté en línea, lo cual es muy compacto y útil para las personas que buscan usar programación funcional.

C++

#include <bits/stdc++.h>
#include <iostream>
using namespace std;
 
int main()
{
 
    vector<int> vec{ 1, 2, 3, 4, 5 };
 
    // this increases all the values in the vector by 1;
    for_each(vec.begin(), vec.end(), [](int& a) { a++; });
 
    // this prints all the values in the vector;
    for_each(vec.begin(), vec.end(),
             [](int a) { cout << a << " " << endl; });
 
    return 0;
}
Producción

2 
3 
4 
5 
6 

Este artículo es una contribución de Astha Tyagi . 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 *