1. ホーム
  2. c++

[解決済み] std::stringをvector<string>に分割する正しい方法

2022-03-14 18:47:44

質問

<ブロッククオート

重複している可能性があります。
文字列を分割するには?

文字列を文字列のベクトルに分割する正しい方法は何でしょうか。デリミタはスペースまたはカンマです。

どのように解決するのですか?

スペースで区切られた文字列の場合は、このようにすればよいでしょう。

std::string s = "What is the right way to split a string into a vector of strings";
std::stringstream ss(s);
std::istream_iterator<std::string> begin(ss);
std::istream_iterator<std::string> end;
std::vector<std::string> vstrings(begin, end);
std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));

出力します。

What
is
the
right
way
to
split
a
string
into
a
vector
of
strings


カンマとスペースが混在する文字列

struct tokens: std::ctype<char> 
{
    tokens(): std::ctype<char>(get_table()) {}
 
    static std::ctype_base::mask const* get_table()
    {
        typedef std::ctype<char> cctype;
        static const cctype::mask *const_rc= cctype::classic_table();
 
        static cctype::mask rc[cctype::table_size];
        std::memcpy(rc, const_rc, cctype::table_size * sizeof(cctype::mask));
 
        rc[','] = std::ctype_base::space; 
        rc[' '] = std::ctype_base::space; 
        return &rc[0];
    }
};
 
std::string s = "right way, wrong way, correct way";
std::stringstream ss(s);
ss.imbue(std::locale(std::locale(), new tokens()));
std::istream_iterator<std::string> begin(ss);
std::istream_iterator<std::string> end;
std::vector<std::string> vstrings(begin, end);
std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));

出力します。

right
way
wrong
way
correct
way