увеличить сплит с одним символом или только одной строкой - PullRequest
8 голосов
/ 18 апреля 2011

Я хочу разбить строку на один символ или строку.Я хотел бы использовать boost::split, так как boost string является нашим стандартом для базовой обработки строк (я не хочу смешивать несколько методов).

В случае одного символа я мог бы сделать split(vec,str,is_any_of(':')), но я 'Хотелось бы узнать, есть ли способ указать только один символ.Это может улучшить производительность, но, что более важно, я думаю, что код будет более понятным только с одним символом, поскольку is_any_of передает другое значение того, что я хочу.

Для сопоставления со строкой Iне знаю, какой синтаксис использовать.Я не хочу строить регулярные выражения;какой-то простой синтаксис, такой как split(vec,str,match_str("::"), был бы хорош.

Ответы [ 3 ]

10 голосов
/ 27 ноября 2012

Я искал тот же ответ, но не смог его найти. Наконец мне удалось изготовить его самостоятельно.

Вы можете использовать std::equal_to для формирования необходимого предиката. Вот пример:

boost::split(container, str, std::bind1st(std::equal_to<char>(), ','));

Именно так я и делаю, когда мне нужно разбить строку, используя один символ.

3 голосов
/ 19 апреля 2011

В следующем коде позвольте мне принять using namespace boost для краткости.
Что касается разделения на символ, если разрешено только algorithm/string, is_from_range может служить цели:

split(vec,str, is_from_range(':',':'));

В качестве альтернативы, если разрешено lambda:

split(vec,str, lambda::_1 == ':');

или если разрешена подготовка выделенного предиката:

struct match_char {
  char c;
  match_char(char c) : c(c) {}
  bool operator()(char x) const { return x == c; }
};

split(vec,str, match_char(':'));

Что касается сопоставления со строкой, как упоминал David Rodri'guez , похоже, что не так с split. Если разрешен iter_split, возможно, следующий код будет соответствовать цели:

iter_split(vec,str, first_finder("::"));
1 голос
/ 18 апреля 2011

На простом токене я бы просто оставил is_any_of, так как довольно легко понять, что означает is_any_of( single_option ).Если вы действительно хотите изменить его, третий элемент - это функтор, так что вы можете передать функтор equals в функцию split.

Этот подход не будет работать с несколькими токенами, как итерациядолжен быть характерным для персонажа.Я недостаточно знаю библиотеку, чтобы предлагать готовые альтернативы, но вы можете реализовать функциональность поверх split_iterator s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...