2010-10-29 10 views
10

Vorrei dividere una stringa lungo spazi bianchi e so che i token rappresentano interi validi. Mi piacerebbe trasformare i token in numeri interi e compilare un vettore con essi.C++: un modo elegante per dividere la stringa e inserire contenuti in std :: vector

Potrei usare boost :: split, creare un vettore di stringhe di token, quindi usare std :: transform.

Qual è la vostra soluzione? Usare boost è accettabile.

+3

possibile duplicato di [Come faccio tokenize una stringa in C++?] (Http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c) - vedere risposta da @KeithB –

+18

Per quanto riguarda alcuni degli esempi di seguito: http: //www.codeproject. com/KB/recipes/Tokenizer.aspx Sono molto efficienti e alquanto eleganti. La libreria String Toolkit rende l'elaborazione di stringhe complessa in C++ semplice e facile. –

risposta

8

Qualcosa di simile a questo:

std::istringstream iss("42 4711 "); 
std::vector<int> results(std::istream_iterator<int>(iss) 
         , std::istream_iterator<int>()); 

?

3

È possibile utilizzare Boost.Tokenizer. Può essere facilmente racchiuso in una funzione explode_string che accetta una stringa e il delimitatore e restituisce un vettore di token.

Utilizzare transform sul vettore restituito è una buona idea per la trasformazione da stringhe a int. puoi anche passare l'iteratore Boost.Tokenizer nell'algoritmo transform.

+0

C'è un modo per usare boost :: tokenizer con token arbitrari? Sembra funzionare con caratteri come '' ',', ',' (',') ','; ''. C'è un modo per usare ad esempio ''m'' come un token? – user3728501

0

È sempre possibile utilizzare strtok o string.find(). biblioteca algoritmo stringa

1

Usa di Boost per split la stringa in un vettore di stringhe, poi std::for_each e sia atoi o boost::lexical_cast per trasformarli in int s. È probabile che sia molto più semplice di altri metodi, ma potrebbe non avere le migliori prestazioni a causa della copia (se qualcuno ha un modo per migliorarlo e rimuoverlo, si prega di commentare).

std::vector<int> numbers; 

void append(std::string part) 
{ 
    numbers.push_back(boost::lexical_cast<int>(part)); 
} 

std::string line = "42 4711"; // borrowed from sbi's answer 
std::vector<std::string> parts; 
split(parts, line, is_any_of(" ,;")); 
std::for_each(parts.being(), parts.end(), append); 

Approssimativo.

http://www.boost.org/doc/libs/1_44_0/doc/html/string_algo.html http://www.boost.org/doc/libs/1_44_0/libs/conversion/lexical_cast.htm

Problemi correlati