C++库里也没有提供字符串分隔函数,所以很难直接一行代码直接分隔出来,不像其它语言那样方便。
要么就是拿getline
,stringstream
手动实现一个字符串分隔函数。
感觉还是背一个版本的字符串分隔函数比较好,下次遇到需要字符串分隔的地方直接快速写出来。
我提供一个我经常写的一个版本。可以按照分隔符分隔,分隔符可以是单个字符或者一个字符串,而且可以很好处理重复的分隔符:
vector<string> split(string s, const string d) { if (s.empty()) return {}; vector<string> res; std::string strs = s + d; size_t pos = strs.find(d); size_t len = strs.size(); while (pos != string::npos) { string x = strs.substr(0, pos); if (x!="") res.push_back(x); strs = strs.substr(pos+d.size(), len); pos = strs.find(d); } return res; }
或者,其它的方法,大家可以参考学一下,我在github页面记录的:
std::vector<std::string> split_v1(std::string & str) { std::istringstream iss(str); return std::vector<std::string>(std::istream_iterator<std::string>{iss}, std::istream_iterator<std::string>()); } ///////////////////////////////////////////////////////////////////////////// template<char delimiter> class MyString : public std::string {}; template<char delimiter> std::istream& operator>>(std::istream& is, MyString<delimiter>& output) { std::getline(is, output, delimiter); return is; } template<char delimiter> std::vector<std::string> split_v2(std::string& str) { std::istringstream iss(str); return std::vector<std::string>(std::istream_iterator<MyString<delimiter>>{iss}, std::istream_iterator<MyString<delimiter>>()); } ///////////////////////////////////////////////////////////////////////////// std::vector<std::string> split_v3(const std::string& s, char delimiter) { std::vector<std::string> tokens; std::string token; std::istringstream token_stream(s); while (std::getline(token_stream, token, delimiter)) { tokens.push_back(token); } return tokens; }
split_v1
方法简单,只使用了STL的东西,由于istringstream
的特性,这里只能按空格切割字符串。split_v2
可以通过template
在编译器指定分隔符。split_v3
在运行时决定分隔符。