C++20 推荐用 std::erase(s, '|') 一行删除;兼容写法为 s.erase(std::remove(s.begin(), s.end(), '|'), s.end());std::replace 或 regex_replace 均不适用于单纯删单字符。

用 std::erase + std::remove 最简洁(C++20)
如果你的编译器支持 C++20,std::erase 是最直接的方案:它原地修改、语义清晰、一行搞定。
-
std::erase是std::string的定制化擦除函数,专为容器设计,比手动写循环更安全 - 它内部自动调用
erase-remove惯用法,但封装后无需暴露迭代器细节 - 注意:不是所有旧项目都开 C++20,GCC 11+ / Clang 12+ / MSVC 19.29+ 才默认启用
std::string s = "a|b|c|d"; std::erase(s, '|'); // 直接移除所有 '|' 字符 // s 变为 "abcd"
兼容 C++11 的通用写法:std::remove + erase 成对使用
这是最广泛兼容的方案,也是理解“删除字符”底层逻辑的关键。单独用 std::remove 不会真正删掉元素,只是把目标字符挤到末尾——必须配合 string::erase 才生效。
-
std::remove返回的是新逻辑结尾的迭代器,不是被删字符个数 - 别漏掉
erase调用,否则字符串长度不变,末尾残留无效字符 - 参数顺序固定:
begin(), end(), value_to_remove,不能反过来
std::string s = "x|y|z|"; s.erase(std::remove(s.begin(), s.end(), '|'), s.end()); // s 变为 "xyz"
用 std::replace 替换成空字符?不行
有人想用 std::replace 把 '|' 换成 '<p>有人想用 <code>std::replace 把 '|' 换成 ' ' 或空格,这会导致错误结果或未定义行为。
-
std::string不以
