Определение позиции в исходной строке из заданного Boost token_iterator - PullRequest
3 голосов
/ 02 мая 2011

Если строка была обработана с использованием токенайзера Boost, возможно ли получить позицию в исходной строке, на которую указывает данный итератор токена:

boost:tokenizer<> tok( "this is the original string" );
for(tokenizer<>::iterator it=tok.begin(); it!=tok.end();++it)
{
    std::string strToken = *it;
    int charPos = it.?                /* IS THERE A METHOD? */
}

Я понимаю, что мог бы создать определенный char_separator с определенным списком «сохраненных разделителей» и указать keep_empty_tokens, чтобы попытаться самостоятельно отслеживать ход выполнения итератора, но я надеялся, что существует более простой способ использования только самого итератора.

Ответы [ 3 ]

5 голосов
/ 03 мая 2011

Похоже, это то, что вы ищете:

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

int main()
{
  typedef boost::tokenizer<> tok_t;

  std::string const s = "this is the original string";
  tok_t const tok(s);
  for (tok_t::const_iterator it = tok.begin(), it_end = tok.end(); it != it_end; ++it)
  {
    std::string::difference_type const offset = it.base() - s.begin() - it->size();
    std::cout << offset << "\t::\t" << *it << '\n';
  }
}

Онлайн-демонстрация

1 голос
/ 02 мая 2011

Если вам нужен только конец текущего токена, base() функция-член может соответствовать цели:

std::string s = "this is the original string";
boost::tokenizer<> tok(s);
for(boost::tokenizer<>::iterator it=tok.begin(); it!=tok.end();++it)
{
    int charPos = it.base() - s.begin();
}

К сожалению, похоже, нет способа восстановить начало текущего токена в boost::tokenizer.

0 голосов
/ 02 мая 2011

Как насчет:

 int charPos = it - tok.begin() ;
...