2013-12-18 18 views
9

Mam ciąg znaków, który zawiera pewną liczbę liczb całkowitych, które są ograniczone spacjami. Na przykład:parsować ciąg do wektora int

string myString = "10 15 20 23"; 

Chcę przekonwertować go na wektor liczb całkowitych. Tak więc w przykładzie wektor powinien być równy

vector<int> myNumbers = {10, 15, 20, 23}; 

Jak mogę to zrobić? Przepraszam za głupie pytanie.

+0

Wykorzystanie 'boost :: split_regex' – Blacktempel

+0

@juanchopanza mógłbyś łaskawie wyjaśnić, jak do łupania ** strun * * jest traktowany tak samo jak podział na wektor *** int ***? –

+0

@jrok Istnieją znaczne różnice między zwykłym dzieleniem ciągu a dzieleniem ciągu przy jednoczesnym przekształcaniu typu. –

Odpowiedz

17

Można użyć std::stringstream. Będziesz musiał #include <sstream> oprócz innych obejmuje.

#include <sstream> 
#include <vector> 
#include <string> 

std::string myString = "10 15 20 23"; 
std::stringstream iss(myString); 

int number; 
std::vector<int> myNumbers; 
while (iss >> number) 
    myNumbers.push_back(number); 
+0

Myślę, że dodanie także instrukcji include sprawi, że ta odpowiedź będzie jeszcze lepsza. – Wolf

+0

@Wolf Tak, dziękuję za wskazanie. Dodany. –

+0

Mam na myśli wszystkie (+ wektor) - a także [używając deklaracji] (http://en.cppreference.com/w/cpp/language/using_declaration) niezbędne do kompilacji. Zostawię moje (+1) gotowe :) – Wolf

0

To jest właściwie duplikat drugiej odpowiedzi.

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

int main(int argc, char* argv[]) { 
    std::string s = "1 2 3 4 5"; 
    std::istringstream iss(s); 
    std::vector<int> v{std::istream_iterator<int>(iss), 
         std::istream_iterator<int>()}; 
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); 
} 
+0

Nie trzeba używać 'std :: copy'. Ponieważ 'std :: vector' ma konstruktor, który pobiera dwa iteratory (podobnie jak std :: copy). –

+1

Również starsza pętla * dla wyjścia nie powinna być tutaj zawarta, ponieważ jest * niełatwa *. – Wolf

5
std::string myString = "10 15 20 23"; 
std::istringstream is(myString); 
std::vector<int> myNumbers(std::istream_iterator<int>(is), std::istream_iterator<int>()); 

Albo zamiast ostatniej linii, jeśli wektor został już zdefiniowany następnie

+2

Byłoby bardziej poprawnie napisać ostatni wiersz jako std :: vector myNumbers ((std :: istream_iterator (is)), std :: istream_iterator ()); to jest dołączenie pierwszego argumentu w nawiasach. W przeciwnym razie zamiast definicji wektorowej będzie to deklaracja funkcji. :) –

+2

Lub możesz użyć konstruktora listy inicjalizatorów zaprojektowanego do rozwiązania tego problemu. 'std :: vector myNumbers {std :: istream_iterator (is), std :: istream_iterator ()};' –