C++20: 像Python一样split字符串

概要

Python 的字符串天生支持 split( ) 操作,支持单个字符或字符串作为分隔符。 C++ 在这方面显得很笨拙,但是在 C++20 下经过一番尝试,还是能够提供类似的简洁调用。

Python 代码

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 类的成员函数和数据成员
cpp 复制代码
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++

cpp 复制代码
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 调用。

相关推荐
老赵的博客7 分钟前
c++ 杂记
开发语言·c++
jimmy.hua10 分钟前
[C++刷怪笼]:set/map--优质且易操作的容器
开发语言·c++
XiaoMu_00120 分钟前
基于Python+Streamlit的旅游数据分析与预测系统:从数据可视化到机器学习预测的完整实现
python·信息可视化·旅游
tan180°22 分钟前
Boost搜索引擎 网络库与前端(4)
linux·网络·c++·搜索引擎
THMAIL23 分钟前
深度学习从入门到精通 - 生成对抗网络(GAN)实战:创造逼真图像的魔法艺术
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·cnn
bkspiderx1 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
郝学胜-神的一滴1 小时前
避免使用非const全局变量:C++中的最佳实践 (C++ Core Guidelines)
开发语言·c++·程序人生
我没想到原来他们都是一堆坏人2 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
总有刁民想爱朕ha2 小时前
车牌模拟生成器:Python3.8+Opencv代码实现与商业应用前景(C#、python 开发包SDK)
开发语言·python·数据挖掘
人衣aoa3 小时前
Python编程基础(八) | 类
开发语言·python