C++ 標準庫無內建 split,常需將 "aa*bb*cc" 按 '*' 分割為 vector<string>{"aa","bb","cc"}。
vector<string> split(const string& s, char delim) {
vector<string> res;
size_t last = 0, pos = s.find(delim, last);
while (pos != string::npos) {
res.push_back(s.substr(last, pos - last));
last = pos + 1;
pos = s.find(delim, last);
}
if (last < s.size()) // 最後一段
res.push_back(s.substr(last));
return res;
}
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string str = "abc*123*xyz";
auto parts = split(str, '*');
for (auto& p : parts) cout << p << endl;
// 輸出: abc 123 xyz
return 0;
}
// 多字符分隔符(任一字符作為分隔)
vector<string> split_multi(const string& s, const string& delims) {
vector<string> res;
size_t last = 0, pos = s.find_first_of(delims, last);
while (pos != string::npos) {
if (pos > last) res.push_back(s.substr(last, pos - last));
last = pos + 1;
pos = s.find_first_of(delims, last);
}
if (last < s.size()) res.push_back(s.substr(last));
return res;
}
// C++17 string_view 零拷貝版(高性能)
vector<string_view> split_view(string_view s, char delim) {
vector<string_view> res;
size_t pos = 0;
while ((pos = s.find(delim)) != string_view::npos) {
res.push_back(s.substr(0, pos));
s.remove_prefix(pos + 1);
}
if (!s.empty()) res.push_back(s);
return res;
}
last == size(),不再額外 push。string_view 避免拷貝。