web-dev-qa-db-ja.com

boost :: is_any_ofを使用した複数の分割トークン

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));

ただし、これにより、ブースト/ STDエラーのリストが生成されます。私はis_any_ofに固執する必要がありますか、またはこれを行うためのより良い方法があります。正規表現の分割を使用していますか?

26
Pete

あなたはこれを試すでしょう:

boost::split(line_parts, s_line, boost::is_any_of("\t,|"));
31
Karl von Moor

最初の行は、lineという名前の既存の変数がないと有効なC++構文ではなく、boost::is_any_ofstd::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/`
}

主な問題は、boost::is_any_ofstd::stringまたはchar*をパラメーターとして受け取ることです。 std::set<std::string>ではありません。

delimsstd::string delims = "\t,|"として定義すると、機能します。

2
Matthieu M.