我知道有字符串标记器,但有一个“int标记器”?Int tokenizer
例如,我要拆分的字符串 “12 34 46”,并具有:
列表[0] = 12
列表[1] = 34
列表[2 ] = 46
特别是,我想知道如果Boost :: Tokenizer做到这一点。虽然我找不到任何不使用字符串的例子。
我知道有字符串标记器,但有一个“int标记器”?Int tokenizer
例如,我要拆分的字符串 “12 34 46”,并具有:
列表[0] = 12
列表[1] = 34
列表[2 ] = 46
特别是,我想知道如果Boost :: Tokenizer做到这一点。虽然我找不到任何不使用字符串的例子。
是的,有:使用流,例如一个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>());
你在找什么是2个单独的行动。首先标记字符串,然后将每个标记转换为int。
我不知道,如果你能做到这一点,而不使用字符串或字符*,因为你必须但无论数字和空格到同一组...
的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的解决方案变得可耻。
性感,但不必要冗长。 'vector list(istream_iterator (sstr),istream_iterator ());'会做得很好。 :) –
avakar
2009-07-17 07:32:43
avakar:奇怪的是,*否*,你的代码不起作用。你或者需要使用显式的构造函数(如我所做的那样),或者在其中一个参数中包含一对额外的大括号;否则,你的代码将不工作 - 相反,这是一个名为'list'的函数原型的声明,返回类型为'vector'。试试看! –
2009-07-17 11:53:00
我的意思是括号,而不是大括号。 – 2009-07-17 11:54:10