2009-01-18 7 views
5

J'ai un exemple de programme d'une étape que je veux implémenter dans mon application. Je veux push_back les éléments int sur la chaîne séparément, dans un vecteur. Comment puis-je?Passage d'une chaîne à une chaîne à un vecteur <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 


    } 

Répondre

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

Ceci est un exemple classique de std::back_inserter.

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

Vous pouvez créer le vecteur dès le début, si vous le souhaitez

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

Rappelez-vous de mettre entre parenthèses dans le premier argument. Le compilateur pense que c'est une déclaration de fonction sinon. Si vous utilisez le vecteur pour juste obtenir itérateurs pour les chiffres, vous pouvez utiliser les itérateurs IStream directement:

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

Ceci est un exemple parfait, IMHO, de ce qui est mal avec C++. Dans presque tous les autres langages, ce serait un split sur '', suivi de quelque chose comme .toInt() pour chaque élément. Au lieu de cela, nous avons une collection extrêmement complexe d'algorithmes modélisés en cours d'application. – dicroce

+3

J'entends ce que vous dites dicroce. OTOH, cette approche plus compliquée est plus rapide, puisque vous évitez de créer un tableau temporaire ou une liste de chaînes, et aussi plus puissant - le même code pourrait être utilisé pour copier n'importe quelle sorte de "gamme de valeurs" (représentée par une paire de itérateurs) dans un vecteur. –

+4

C++ 11: 'vecteur nombres (istream_iterator (lineStream), {});' –

Questions connexes