Как получить "пользовательский split()" в списке с помощью strtk?
Я прочитал http://www.codeproject.com/KB/recipes/Tokenizer.aspx, и я хочу иметь последний пример (в конце, непосредственно перед всеми графиками) "Расширение разделителя Predicates" в моей основной, но я не получаю те же выходные токены, что и автор статьи, когда я назначаю токен_list вектору, почему?
Как поместить реальный результат в список или вектор? Я хочу иметь это:
- list0 abc
- list1 123, mno xyz
- list2 я \, jk
Но у меня есть что-то вроде:
- list0 abc; "123, mno xyz", я \, jk
- list1 123, mno xyz ", я \, jk
- list2 я \, jk
Исходный образец:
class extended_predicate
{
public:
extended_predicate(const std::string& delimiters)
: escape_(false),
in_bracket_range_(false),
mdp_(delimiters)
{}
inline bool operator()(const unsigned char c) const
{
if (escape_)
{
escape_ = false;
return false;
}
else if ('\\' == c)
{
escape_ = true;
return false;
}
else if ('"' == c)
{
in_bracket_range_ = !in_bracket_range_;
return true;
}
else if (in_bracket_range_)
return false;
else
return mdp_(c);
}
inline void reset()
{
escape_ = false;
in_bracket_range_ = false;
}
private:
mutable bool escape_;
mutable bool in_bracket_range_;
mutable strtk::multiple_char_delimiter_predicate mdp_;
};
int main()
{
std::string str = "abc;\"123, mno xyz\",i\\,jk";
strtk::std_string::token_list_type token_list;
strtk::split(extended_predicate(".,; "),
str,
std::back_inserter(token_list),
strtk::split_options::compress_delimiters);
return 0;
}
Ответы
Ответ 1
Я мог бы добиться одинаковых результатов в кодепроекте. Какую версию gcc вы используете? Моя версия gcc следующая.
g++ (GCC) 4.5.2
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
UPDATE:
Мой протестированный код находится здесь: https://gist.github.com/1037493