Bucles Foreach en C++
Por medio CodeProject de una de las páginas de programación que suelo leer con frecuencia, descubro una sencilla forma de crear bucles para iterar sobre contenedores de elementos de una forma genérica y muy sencilla mediante macros #define. Estas macros muchas veces confunden a otros programadores, y por ellos muchos programadores argumentan a menudo que este tipo de “Macros-mágicas” deberían ser evitadas. Sin embargo muchos otros las encuentran muy útiles si se usan correctamente.
Introducción
En lenguajes como Java y C# podemos incrementar la velocidad de codificación usando un tipo especial de bucle for (en ocasiones llamados bucles for each) para iterar a través de contenedores de elementos. Un ejemplo en java sería el siguiente:
ArrayList<int> List = new ArrayList<int>(); // Version java de std::vector
List.add(1); // Algunos valores
List.add(3);
for (int i : List) // bucle for each
{
// Hacer cosas con tu iterador ...
}
C++ no tiene un bucle for each (actualmente, hay un bucle for_each en las STL, pero se puede argumentar que no te interesa usar dicha librería), por lo que si quieres iterar en un std::vector en C++ tienes que escribir mucho más código en comparación con Java, teniendo que utilizar iteradores. Ejemplo en C++:
std::vector<int> List = new std::vector<int>(); // Vector C++ de std::vector
List.push_back(1); // Algunos valores
List.push_back(3);
for (std::vector<int>::iterator i = List.begin(); i != List.end(); i++) // Muy largo en c++
{
// Hacer cosas con tu iterador ...
}
Como podéis comprobar hay bastante diferencia y claridad de código.
Usando el bucle “forx”
A continuación se muestra el código creado por JimmyAberg con el que podrás usar el preprocesador para escribir tu propio bucle foreach en C++. Este bucle estará limitado para trabajar con contenedores STL y le podremos dar el nombre que queramos, en este caso “forx”:
#define forx(_type,_iter,_coll) for (_type::iterator _iter = _coll.begin(); _iter != _coll.end(); _iter++)
¿Cómo usamos el bucle forx después de haberlo definido? Aquí se muestra un ejemplo:
forx (std::vector<int>, i, List)
{
int a = (*i);
}
¿Sencillo verdad? :-).
En en enlace que he dejado al principio de la entrada vienen más ejemplos de uso para usar el bucle con otros tipos de datos.
loading...


loading...
Exelente, se agradece mucho, y ya que estoy, te comparto esto, lo he usado en algunos proyectos:
#define DEBUG(x) cout<<#x<<” = “<<x
de mas esta decir que te patea si no ve el cout y que el x tiene que se de una clase que tenga definido el <getName())
..
la salida seria
someObject->getName() = someObjectName
saludos y gracias, lastima que ya borraron el post en codeproject