Boost :: tokenizer разделенный запятой (c ++) - PullRequest
8 голосов
/ 30 октября 2011

Должно быть, ребята, вам будет легко .....

Я играю с токенайзерами, использующими Boost, и хочу создать токен, разделенный запятыми. вот мой код:

    string s = "this is, , ,  a test";
boost::char_delimiters_separator<char> sep(",");
boost::tokenizer<boost::char_delimiters_separator<char>>tok(s, sep);


for(boost::tokenizer<>::iterator beg= tok.begin(); beg!=tok.end(); ++beg)
{
    cout << *beg << "\n";
}

Вывод, который я хочу получить:

This is


 a test

Что я получаю:

This
is
,
,
,
a
test

ОБНОВЛЕНО

1 Ответ

14 голосов
/ 30 октября 2011

Вы должны отдать разделитель токенизатору!

boost::tokenizer<boost::char_delimiters_separator<char>>tok(s, sep);

Также замените устаревший char_delimiters_separator на char_separator:

string s = "this is, , ,  a test";
boost::char_separator<char> sep(",");
boost::tokenizer< boost::char_separator<char> > tok(s, sep);
for(boost::tokenizer< boost::char_separator<char> >::iterator beg = tok.begin(); beg != tok.end(); ++beg)
{
    cout << *beg << "\n";
}

Пожалуйста, обратите внимание, что есть также несоответствие параметров шаблона: это хорошая привычка печатать определения таких сложных типов: итоговая версия может быть:

string s = "this is, , ,  a test";
boost::char_separator<char> sep(",");
typedef boost::tokenizer< boost::char_separator<char> > t_tokenizer;
t_tokenizer tok(s, sep);
for (t_tokenizer::iterator beg = tok.begin(); beg != tok.end(); ++beg)
{
    cout << *beg << "\n";
}
...