2009-01-18 10 views
5

Tengo este programa de ejemplo de un paso que quiero implementar en mi aplicación. Quiero push_back los elementos int en la cadena por separado, en un vector. ¿Cómo puedo?Pasar de string a stringstream a vector <int>

#include <iostream> 
#include <sstream> 

#include <vector> 

using namespace std; 

int main(){ 

    string line = "1 2 3 4 5"; //includes spaces 
    stringstream lineStream(line); 


    vector<int> numbers; // how do I push_back the numbers (separately) here? 
    // in this example I know the size of my string but in my application I won't 


    } 

Respuesta

12
int num; 
while (lineStream >> num) numbers.push_back(num); 
25

Este es un ejemplo clásico de std::back_inserter.

copy(istream_iterator<int>(lineStream), istream_iterator<int>(), 
    back_inserter(numbers)); 

Puede crear el vector desde el primer momento en adelante, si lo desea

vector<int> numbers((istream_iterator<int>(lineStream)), 
        istream_iterator<int>()); 

recuerda poner paréntesis alrededor del primer argumento. El compilador cree que es una declaración de función de lo contrario. Si se utiliza el vector para conseguir justo iteradores para los números, puede utilizar los iteradores IStream directamente:

istream_iterator<int> begin(lineStream), end; 
while(begin != end) cout << *begin++ << " "; 
+1

Este es un ejemplo perfecto, en mi humilde opinión, de cuál es incorrecto con C++. En prácticamente cualquier otro idioma, esto sería una división en '', seguida de algo como .toInt() para cada elemento. En cambio, tenemos una colección inmensamente complicada de algoritmos templados que se están aplicando. – dicroce

+3

Escucho lo que dices dicroce. OTOH, este enfoque más complicado es más rápido, ya que evitas crear una matriz temporal o una lista de cadenas, y también más poderoso: se podría usar mucho el mismo código para copiar cualquier tipo de "rango de valores" (representado por un par de iteradores) en un vector. –

+4

C++ 11: 'vector números (istream_iterator (lineStream), {});' –

Cuestiones relacionadas