You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中除substr技巧外,还有哪些方法根据起止索引获取子串?

你提到的用substr(start, end - start + 1)来根据起止索引获取子串的方法确实非常实用,也是日常开发中最常用的方式之一。在C++里,还有几种不同的思路可以实现同样的需求,我给你详细说说:

  • 使用std::string的迭代器构造函数
    C++的std::string提供了接受两个迭代器的构造函数,利用它可以直接从原字符串的指定范围创建子串。因为迭代器遵循左闭右开的规则,所以我们需要把结束索引加1来匹配这个范围:

    // extract 'go' from 'iamgoodhere'
    std::string s = "iamgoodhere";
    int start = 3, end = 4;
    std::string sub(s.begin() + start, s.begin() + end + 1);
    std::cout << sub; // 输出 go
    

    这种方式逻辑直观,如果你平时习惯用迭代器操作容器,代码的可读性会很高。

  • 使用std::string_view(C++17及以上版本)
    如果你使用的是C++17或更高版本,std::string_view是个更高效的选择——它不会拷贝原字符串的字符,只是创建一个指向原字符串的视图,能节省内存和拷贝开销。你可以通过两种方式用它获取子串:

    #include <string_view>
    // extract 'go' from 'iamgoodhere'
    std::string s = "iamgoodhere";
    int start = 3, end = 4;
    
    // 方式1:调用string_view的substr方法
    std::string_view sv(s);
    std::cout << sv.substr(start, end - start + 1); // 输出 go
    
    // 方式2:用迭代器构造string_view
    std::string_view sub_sv(s.begin() + start, s.begin() + end + 1);
    std::cout << sub_sv; // 输出 go
    

    当你只需要读取子串而不需要修改它时,string_view是最优解之一。

  • 手动遍历拷贝(仅特殊场景适用)
    如果你需要在获取子串的过程中做一些额外的字符处理,也可以手动循环遍历索引范围,逐个拷贝字符:

    // extract 'go' from 'iamgoodhere'
    std::string s = "iamgoodhere";
    int start = 3, end = 4;
    std::string sub;
    sub.reserve(end - start + 1); // 提前分配内存,提升效率
    for (int i = start; i <= end; ++i) {
        sub += s[i];
    }
    std::cout << sub; // 输出 go
    

    这种方法代码相对繁琐,效率也不如前面两种,一般只在需要自定义处理逻辑时才会使用。

内容的提问来源于stack exchange,提问作者FlyingAura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:06:51