2012-05-09 21 views

Respuesta

28

Sí: std::for_each.

void foo(int a) { 
    std::cout << a << "\n"; 
} 

std::vector<int> v; 

... 

std::for_each(v.begin(), v.end(), &foo); 
+1

¿se esperaría que las mejoras de velocidad usen esto (a diferencia del bucle)? – dbliss

+2

@dbliss, la implementación de 'for_each()' probablemente sea un bucle y, como usa plantillas, no debería haber diferencia. Sin embargo, con C++ 17, pueden introducir el paralelismo que sería totalmente transparente para usted y muy bien podría terminar más rápido. –

8

Uso for_each:

// for_each example 
#include <iostream> 
#include <algorithm> 
#include <vector> 
using namespace std; 

void myfunction (int i) { 
    cout << " " << i; 
} 

struct myclass { 
    void operator() (int i) {cout << " " << i;} 
} myobject; 

int main() { 
    vector<int> myvector; 
    myvector.push_back(10); 
    myvector.push_back(20); 
    myvector.push_back(30); 

    cout << "myvector contains:"; 
    for_each (myvector.begin(), myvector.end(), myfunction); 

    // or: 
    cout << "\nmyvector contains:"; 
    for_each (myvector.begin(), myvector.end(), myobject); 

    cout << endl; 

    return 0; 
} 
6

Si tiene C++ 11, hay un método aún más corto: ranged-based for. Su propósito es exactamente esto.

std::vector<int> v {1,2,3,4,5}; 

for (int element : v) 
    std::cout << element; //prints 12345 

También puede aplicar referencias e incorporarlas también, según corresponda, o usar auto cuando el tipo es largo.

std::vector<std::vector<int>> v {{1,2,3},{4,5,6}}; 

for (const auto &vec : v) 
{ 
    for (int element : vec) 
     cout << element; 

    cout << '\n'; 
} 

Salida:

123 
456 
+0

Esta sintaxis aún no es compatible con vs2011, por ejemplo. Al menos no mi copia. Pero más +1. – ervinbosenbacher

+0

@xebo, ah, eso apesta ya que esta es una de las mejores características de C++ 11 imo. – chris

+0

Para cualquier visitante futuro, se ha agregado ranged-for a Visual Studio 2012. – chris

27

si ya recibió varias respuestas mencionar std::for_each.

Mientras que éstos responden a la pregunta con lo solicitado, me gustaría añadir que, al menos en mi experiencia, es std::for_each sobre la menos útil de los algoritmos estándar.

que utiliza (por ejemplo) std::transform, que es básicamente a[i] = f(b[i]); o result[i] = f(a[i], b[i]); mucha más frecuencia que std::for_each. Muchas personas usan con frecuencia std::for_each para imprimir elementos de una colección; para ese propósito, std::copy con un std::ostream_iterator ya que el destino funciona mucho mejor.

+3

Esta es la respuesta que estaba buscando, 'transform' está más cerca del' map' de Python que 'for_each', ya que' map' genera una lista de salidas, mientras que 'for_each' llama a una función pero descarta las salidas. –

Cuestiones relacionadas