2009-07-17 7 views
15

Sé que hay tokenizers de cadenas, pero ¿hay un "int tokenizer"?Int tokenizer

Por ejemplo, quiero dividir la cadena "12 34 46" y tienen:

lista [0] = 12

lista [1] = 34

lista [2 ] = 46

En particular, me pregunto si Boost :: Tokenizer hace esto. Aunque no pude encontrar ningún ejemplo que no usara cadenas.

Respuesta

12

sí hay: utilizar una corriente, por ejemplo, un stringstream:

stringstream sstr("12 34 46"); 
int i; 
while (sstr >> i) 
    list.push_back(i); 

Como alternativa, también se puede utilizar algoritmos de STL y/o adaptadores de iterador combinados con los constructores:

vector<int> list = vector<int>(istream_iterator<int>(sstr), istream_iterator<int>()); 
+0

Sexy, pero innecesariamente detallado. 'vector lista (istream_iterator (sstr), istream_iterator ());' haría muy bien. :) – avakar

+2

avakar: curiosamente, * no *, su código no funciona. O necesita usar el constructor explícito (como lo hice yo) o incluir un par adicional de llaves alrededor de uno de los argumentos; de lo contrario, su código * no * funcionará; en su lugar, esta es la declaración de un prototipo de función llamado 'list' con tipo de retorno' vector '. ¡Pruébalo! –

+0

Quise decir paréntesis, no llaves. –

0

Lo que estás buscando son 2 acciones separadas. Primero tokenize la cadena, luego convierta cada token a un int.

0

No estoy seguro de si se puede hacer esto sin usar cuerdas o char * porque hay que pero tanto en número como en espacios mismo conjunto ...

14

El C++ String Toolkit Library (StrTk) tiene la siguiente solución a su problema:

#include <string> 
#include <deque> 
#include "strtk.hpp" 

int main() 
{ 
    { 
     std::string data = "12 34 46"; 
     std::deque<int> int_list; 
     strtk::parse(data," ",int_list); 
    } 

    { 
     std::string data = "12.12,34.34|46.46 58.58"; 
     std::deque<double> double_list; 
     strtk::parse(data," ,|",double_list); 
    } 

    return 0; 
} 

Más ejemplos se pueden encontrar Here

Nota: El proceso de análisis es EXTREMADAMENTE rápido y eficiente, poniendo a prueba las soluciones stdlib y boost.