К вашему сведению: нет повышения, да, это так, я хочу заново изобрести колесо;)
Существует ли какая-либо форма выборочного итератора (возможного) в C ++?Я хочу разделить строки следующим образом:
some:word{or other
на такую форму:
some : word { or other
Я могу сделать это с помощью двух циклов и find_first_of (":") и ("{") но это кажется (очень) неэффективным для меня.Я подумал, что, возможно, найдется способ создать / определить / написать итератор, который будет перебирать все эти значения с помощью for_each.Боюсь, что из-за этого я напишу полноценный пользовательский итеративный класс для std :: string.
Поэтому я подумал, что, возможно, это подойдет:
std::vector<size_t> list;
size_t index = mystring.find(":");
while( index != std::string::npos )
{
list.push_back(index);
index = mystring.find(":", list.back());
}
std::for_each(list.begin(), list.end(), addSpaces(mystring));
Этовыглядит грязно для меня, и я вполне уверен, что существует более элегантный способ сделать это.Но я не могу думать об этом.У кого-нибудь есть блестящая идея?Спасибо
PS: я не проверял опубликованный код, просто быстрое написание того, что я бы попробовал
ОБНОВЛЕНИЕ: после того, как я учел все ваши ответы, я придумал это,и это работает на мой вкус :).при этом предполагается, что последний символ является новой строкой или чем-то еще, в противном случае окончание {
, }
или :
не будет обработано.
void tokenize( string &line )
{
char oneBack = ' ';
char twoBack = ' ';
char current = ' ';
size_t length = line.size();
for( size_t index = 0; index<length; ++index )
{
twoBack = oneBack;
oneBack = current;
current = line.at( index );
if( isSpecial(oneBack) )
{
if( !isspace(twoBack) ) // insert before
{
line.insert(index-1, " ");
++index;
++length;
}
if( !isspace(current) ) // insert after
{
line.insert(index, " ");
++index;
++length;
}
}
}
Комментарии приветствуются как всегда:)