Здравствуйте, FR, Вы писали:
FR>Хотя проверил, бустовский сплит работает также как мой, на два пробела выдает пустую строку, так что ошибка у тебя
Да, ты прав. Просто в случае пробелов это как-то нелогично. Но если разделители запятые или что-то вроде того, то тогда действительно это имеет смысл.
Но раз уж так задумано, то тогда все еще проще, и еще слегка быстрее:
template <class C, class S, class P>
inline void split(C & c, const S & str, P & is_delimiter)
{
typename S::const_iterator it = str.begin(), token_start = it, end = str.end();
for(; it != end; ++it)
{
if (is_delimiter(*it))
{
if (token_start != it)
c.push_back(S(token_start, it));
++(token_start = it);
}
}
if (token_start != it)
c.push_back(S(token_start, it));
}
FR>Где это там вектор пересоздается? Не было такого, у меня во всех вариантах vector<string> tokens(5); вынесен из цикла.
В твоих примерах нет. Но в примерах на C# и других языках массивы то создаются заново на каждом вызове. Поэтому я согласен с Андреем Хроповым, что так корректнее сравнивать.