Токенизируйте строку и сохраните результат в boost :: iterator_range & lt; std :: string :: iterator & gt;

Мне нужно токенизировать (», ‘\ n’, ‘\ t’ как разделитель) текст с чем-то вроде

std::string text = "foo   bar";
boost::iterator_range<std::string::iterator> r = some_func_i_dont_know(text);

Позже я хочу получить вывод с:

for (auto i: result)
std::cout << "distance: " << std::distance(text.begin(), i.begin())
<< "\nvalue: " << i << '\n';

Что производит с примером выше:

distance: 0
value: foo
distance: 6
value: bar

Спасибо за любую помощь.

1

Решение

Я бы не использовал древний токенизатор здесь. Просто используйте строковый алгоритм split предложение:

Жить на Колиру

#include <boost/algorithm/string.hpp>
#include <iostream>

using namespace boost;

int main()
{
std::string text = "foo   bar";
boost::iterator_range<std::string::iterator> r(text.begin(), text.end());

std::vector<iterator_range<std::string::const_iterator> > result;
algorithm::split(result, r, is_any_of(" \n\t"), algorithm::token_compress_on);

for (auto i : result)
std::cout << "distance: " << distance(text.cbegin(), i.begin()) << ", "<< "length: " << i.size() << ", "<< "value: '" << i << "'\n";
}

Печать

distance: 0, length: 3, value: 'foo'
distance: 6, length: 3, value: 'bar'
2

Другие решения


По вопросам рекламы [email protected]