2010-11-11 13 views
16

¿Hay una forma más directa de hacerlo?¿Cómo uso for_each para enviar a cout?

for_each(v_Numbers.begin(), v_Numbers.end(), bind1st(operator<<, cout));

Sin un bucle explícito for, si es posible.

EDIT:

Cómo hacer esto para std::cin con un std::vector si es posible? (¿Cómo leer n elementos solamente)?

+0

Solución agregada para su edición a mi respuesta. –

+0

@ Space_C0wb0y: editado mi edición. Por favor, compruebe. – nakiya

+0

Enlace agregado para su segunda edición. –

Respuesta

27

Se podría lograr esto usando std::copy en un std::ostream_iterator:

std::vector<int> v_Numbers; // suppose this is the type 
// put numbers in 
std::copy(v_Numbers.begin(), v_Numbers.end(), 
      std::ostream_iterator<int>(cout)); 

Sería aún mejor si usted agrega un poco sufijo:

std::copy(v_Numbers.begin(), v_Numbers.end(), 
      std::ostream_iterator<int>(cout, "\n")); 

Esto supone que el recipiente es una vector<int>, por lo que tendrá que reemplazar esa parte con el tipo apropiado.

Editar con respecto a la entrada de lectura:

Por el contrario, puede copiar de una gama de std::istream_iterator en un vector usando std::back_inserter:

std::vector<int> v_Numbers; 
std::copy(std::istream_iterator<int>(cin), std::istream_iterator<int>(), 
      std::back_inserter(v_Numbers)); 

Si desea leer n solamente elementos, mira this question .

+1

Casi. 'ostream_iterator' es una plantilla, quiere' std :: ostream_iterator (cout) '. – GManNickG

+0

@Gman: Gracias, corregido. –

+2

No hay problema; He formateado la respuesta por lo que no hay barras de desplazamiento, me resulta más fácil leer de esa manera. Puede estar en desacuerdo y retroceder si lo desea. – GManNickG

7

Sí, pero debe utilizar el algoritmo std :: copia:

#include <iostream> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    std::vector<int> a; 
    // fill a... 
    std::copy(a.begin(), a.end(), std::ostream_iterator<int>(std::cout)); 
} 
9

Otra opción - Boost.Lambda.

for_each(v.begin(), v.end(), cout << boost::lambda::_1); 
0

No siempre es apropiado en código corporativo, pero en aras de opciones enumerando - si realmente encontrar otra for_each/std :: etc. soluciones de copia demasiado prolijo, se podría escribir:

std::ostream& operator(std::ostream& os, const std::vector<My_Type>& v) 
{ 
    // pick one of the other implementations for here... 
    std::copy(std::istream_iterator<My_Type>(os), std::istream_iterator<My_Type>(), 
      std::back_inserter(v_Numbers)); 
} 

Es mucho mejor si tienes buenos modales (;-p) suficiente para sobrecargar tu instanciación específica de vector (que requiere que My_Type sea más que un typedef para decir int, aunque no es difícil crear una clase de plantilla para crear nuevos tipos envolviendo un tipo arbitrario). De lo contrario, si otra persona hace lo mismo en cualquier lugar de su unidad de traducción, la transmisión podría volverse ambigua.

2

yup, utilizando la expresión lambda (C++ 11) podemos imprimir en línea cada elemento de un contenedor STL para cout.

#include <iostream> // cout 
#include <vector>  // vector 
#include <algorithm> // for_each 
#include <iterator> // istream_iterator 
using namespace std; 

int main() 
{ 
    std::vector<int> v(10,2); 
    std::for_each(v.begin(), v.end(), [](int i)->void {std::cout << i <<endl;}); 
    return 0; 
} 

Para leer los valores de "n" de CIN a vector,

int main() 
{ 
    std::vector<int> v; 

    int elementsToRead; 
    cin>>elementsToRead; // Number of elements to copy 

    // Reading from istream 
    std::istream_iterator<int> ii2(std::cin); 
    std::copy_n(ii2, elementsToRead, std::back_inserter(v)); 

    // printing updated vector 
    std::for_each(v.begin(), v.end(), [](int i)->void {cout << i <<endl;}); 

    return 0; 
} 

(o) mediante el uso de expresión Lambda

std::for_each(std::istream_iterator<int>(cin),std::istream_iterator<int>(),[&v](int i)->void { v.push_back(i);}); 

saber más acerca de expresión Lambda @What is a lambda expression in C++11?

Cuestiones relacionadas