For space separated strings, then you can do this:
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"));
Output:
What
is
the
right
way
to
split
a
string
into
a
vector
of
strings
Here is a modified version of roach's solution that splits based on a string of single character delimiters + supports the option to compress duplicate delimiters.
Here is my variant that work somelike as explode function in PHP, we provide given string and delimiters list.
std::vector< std::string > explode(const std::string& data, const std::string& delimiters) {
auto is_delim = [&](auto & c) { return delimiters.find(c) != std::string::npos; };
std::vector< std::string > result;
for (std::string::size_type i(0), len(data.length()), pos(0); i <= len; i++) {
if (is_delim(data[i]) || i == len) {
auto tok = data.substr(pos, i - pos);
if ( !tok.empty() )
result.push_back( tok );
pos = i + 1;
}
} return result;
}
example of usage
std::string test_delimiters("hello, there is lots of, delimiters, that may be even together, ");
auto dem_res = explode(test_delimiters, " ,"); // space or comma
for (auto word : dem_res) {
std::cout << word << '\n';
} std::cout << "end\n";
the ouput:
hello
there
is
lots
of
delimiters
that
may
be
even
together
end