概要
Python 的字符串天生支持 split( )
操作,支持单个字符或字符串作为分隔符。 C++ 在这方面显得很笨拙,但是在 C++20 下经过一番尝试,还是能够提供类似的简洁调用。
Python 代码
s = '0,11,336,23,370'
nums = s.split(',')
for n in nums:
print(n)
print('---')
items = s.split('11,')
for i in items:
print(i)
基于 C++20 的实现
- 使用了
std::string_view
, 避免了原始字符串的拷贝 - 使用了组合,而不是继承的方式,把
split( )
函数,与原始的字符串str
进行组合,也就是分别作为MyString
类的成员函数和数据成员
class MyString {
private:
std::string data;
public:
MyString(const std::string& str) : data(str) {}
MyString(std::string&& str) : data(std::move(str)) {}
MyString(const char* str) : data(str) {}
// 提供 split 方法
std::vector<std::string> split(const std::string& delimiter) const {
std::vector<std::string> result;
size_t start = 0;
size_t end = 0;
while ((end = data.find(delimiter, start)) != std::string::npos) {
result.emplace_back(data.substr(start, end - start));
start = end + delimiter.length();
}
result.emplace_back(data.substr(start)); // 添加最后一部分
return result;
}
// 提供 std::string 的接口
const std::string& str() const { return data; }
operator const std::string&() const { return data; } // 隐式转换为 std::string
};
调用代码 - C++
int main() {
MyString s("0,11,336,23,370");
// 按 ',' 分割
auto nums = s.split(",");
for (const auto& n : nums) {
std::cout << n << '\n';
}
std::cout << "---\n";
// 按 "11," 分割
auto items = s.split("11,");
for (const auto& i : items) {
std::cout << i << '\n';
}
return 0;
}
总结
本文从 Python 简洁的字符串split操作出发,在 C++20 的限定条件下,通过组合 std::string 和 split( ) 函数,以及使用 std::string_view, 实现了类似 Python 的简洁 API 调用。