#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';
}
}
Комментарии:
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.