Определение позиции в исходной строке из заданного Boost token_iterator

#c #boost #stl #tokenize

#c #boost #stl #маркировать

Вопрос:

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

 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, чтобы попытаться самостоятельно отслеживать прогресс итератора, но я надеялся, что есть более простой способ, используя только сам итератор.

Ответ №1:

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

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

Online Demo

Комментарии:

1. Есть ли какой-либо способ найти начало tok, если мы изменим исходную строку в цикле while (например, можно удалить один символ на основе некоторого условия)?

Ответ №2:

Если вам нужен только конец текущего токена, 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 .

Комментарии:

1. Спасибо. Я принял другой ответ только потому, что он был более полным.

Ответ №3:

Как насчет:

  int charPos = it - tok.begin() ;
  

Комментарии:

1. Вы действительно пробовали это? Это было первое, что я попробовал, но это не сработало, компилятор завершает работу с distance_to недоступным (неправильный тип итератора).

2. Согласно boost.org/doc/libs/1_41_0/libs/tokenizer/tokenizer.htm итератор имеет тип std::string::const_iterator , который должен быть просто указателем const, если вы не используете какую-либо причудливую отладочную реализацию STL.