2009-07-17 30 views
15

我知道有字符串标记器,但有一个“int标记器”?Int tokenizer

例如,我要拆分的字符串 “12 34 46”,并具有:

列表[0] = 12

列表[1] = 34

列表[2 ] = 46

特别是,我想知道如果Boost :: Tokenizer做到这一点。虽然我找不到任何不使用字符串的例子。

回答

12

是的,有:使用流,例如一个stringstream

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

另外,您还可以使用与构造结合STL算法和/或迭代器适配器:

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

性感,但不必要冗长。 'vector list(istream_iterator (sstr),istream_iterator ());'会做得很好。 :) – avakar 2009-07-17 07:32:43

+2

avakar:奇怪的是,*否*,你的代码不起作用。你或者需要使用显式的构造函数(如我所做的那样),或者在其中一个参数中包含一对额外的大括号;否则,你的代码将不工作 - 相反,这是一个名为'list'的函数原型的声明,返回类型为'vector '。试试看! – 2009-07-17 11:53:00

+0

我的意思是括号,而不是大括号。 – 2009-07-17 11:54:10

0

你在找什么是2个单独的行动。首先标记字符串,然后将每个标记转换为int。

0

我不知道,如果你能做到这一点,而不使用字符串或字符*,因为你必须但无论数字和空格到同一组...

14

C++ String Toolkit Library (StrTk)有以下问题的解决方案:

#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; 
} 

更多的例子可以发现Here

注意:解析过程是EXTREMELY快速且高效,将基于stdlib和boost的解决方案变得可耻。