Несколько разделенных токенов с использованием boost :: is_any_of - PullRequest
25 голосов
/ 25 февраля 2011

Я не уверен, как использовать boost::is_any_of для разделения строки, используя набор символов, любой из которых должен разбивать строку.

Я хотел сделать что-то подобное, поскольку понял, что функция is_any_of принимает параметр Set.

std::string s_line = line = "Please, split|this    string";

std::set<std::string> delims;
delims.insert("\t");
delims.insert(",");
delims.insert("|");

std::vector<std::string> line_parts;
boost::split ( line_parts, s_line, boost::is_any_of(delims));

Однако это приводит к появлению списка ошибок наддува / ЗППП. Должен ли я продолжать с is_any_of или есть лучший способ сделать это, например. используя регулярное выражение?

Ответы [ 3 ]

30 голосов
/ 25 февраля 2011

Вы должны попробовать это:

boost::split(line_parts, s_line, boost::is_any_of("\t,|"));
9 голосов
/ 25 февраля 2011

Ваша первая строка недопустима в синтаксисе C ++ без существующей переменной с именем line, и boost::is_any_of не принимает std::set в качестве параметра конструктора.

#include <string>
#include <set>
#include <vector>
#include <iterator>
#include <iostream>
#include <boost/algorithm/string.hpp>

int main()
{
    std::string s_line = "Please, split|this\tstring";
    std::string delims = "\t,|";

    std::vector<std::string> line_parts;
    boost::split(line_parts, s_line, boost::is_any_of(delims));

    std::copy(
        line_parts.begin(),
        line_parts.end(),
        std::ostream_iterator<std::string>(std::cout, "/")
    );

    // output: `Please/ split/this/string/`
}
2 голосов
/ 25 февраля 2011

Основная проблема заключается в том, что boost::is_any_of принимает std::string или char* в качестве параметра.Не std::set<std::string>.

Вы должны определить delims как std::string delims = "\t,|", и тогда оно будет работать.

...