簡単な実装例を次に示します。
_#include <string>
#include <vector>
#include <sstream>
#include <utility>
std::vector<std::string> explode(std::string const & s, char delim)
{
std::vector<std::string> result;
std::istringstream iss(s);
for (std::string token; std::getline(iss, token, delim); )
{
result.Push_back(std::move(token));
}
return result;
}
_
使用法:
_auto v = explode("hello world foo bar", ' ');
_
注:出力イテレータに書き込むという@Jerryのアイデアは、C++ではより慣用的です。実際、両方を提供できます。最大の柔軟性のために、出力イテレータテンプレートとベクトルを生成するラッパー。
注2:空のトークンをスキップする場合は、if (!token.empty())
を追加します。
標準ライブラリには直接の同等物は含まれていませんが、書くのはかなり簡単です。ただし、C++であるため、通常は特に配列に書き込む必要はありません。むしろ、通常は出力をイテレーターに書き込み、配列、ベクトル、ストリームなどに出力できるようにします。この一般的な順序の何か:
template <class OutIt>
void explode(std::string const &input, char sep, OutIt output) {
std::istringstream buffer(input);
std::string temp;
while (std::getline(buffer, temp, sep))
*output++ = temp;
}