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
相关产品推荐
相关产品推荐

