C++ 字符串分隔 split 函数
simplify-path
http://www.nowcoder.com/questionTerminal/393e5a246a7546d1b2e4d7719647b7d9
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在运行时决定分隔符。
快手公司氛围 614人发布