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

如何使用C++ std::ranges替换字符串中的子串?

C++ Ranges实现字符串子串替换

std::ranges::replace的设计目标是替换容器中的单个元素(对std::string而言就是单个char),它要求被替换值和新值的类型必须与容器元素类型一致——这就是你代码报错的核心原因,因为你传入的是子串(const char[]或std::string),而非单个字符。

基于Ranges的可行实现

下面是符合Ranges风格的子串替换方案,通过反向遍历避免替换后索引偏移的问题:

#include <string>
#include <ranges>
#include <algorithm>

void replace_substring(std::string& str, const std::string& old_sub, const std::string& new_sub) {
    if (old_sub.empty()) return;

    // 反向遍历生成所有匹配位置,避免替换后索引错乱
    auto matches = str | std::views::reverse
                       | std::views::enumerate
                       | std::views::filter([&](const auto& enum_pair) {
                           auto [rev_idx, _] = enum_pair;
                           const size_t pos = str.size() - rev_idx - old_sub.size();
                           return pos < str.size() && str.compare(pos, old_sub.size(), old_sub) == 0;
                       })
                       | std::views::transform([&](const auto& enum_pair) {
                           auto [rev_idx, _] = enum_pair;
                           return str.size() - rev_idx - old_sub.size();
                       });

    std::ranges::for_each(matches, [&](const size_t pos) {
        str.replace(pos, old_sub.size(), new_sub);
    });
}

// 使用示例
int main() {
    std::string str{"The quick brown fox jumped over the lazy dog."};
    replace_substring(str, "the", "a");
    // 结果:"The quick brown fox jumped over a lazy dog."
    return 0;
}

关键细节

  • 用std::views::reverse反向遍历:替换子串会改变字符串长度,反向处理能保证未处理的匹配位置不受前面替换操作的影响
  • 用std::views::enumerate获取反向索引,转换为原字符串的正向匹配起始位置
  • 用std::string::compare替代substr做匹配,避免不必要的内存分配,提升效率
  • 通过Ranges视图链声明式地筛选出所有匹配位置,最后用std::ranges::for_each执行替换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:05:27