c++oding="utf-8" ?>
c++20用std::erase(s, '|')直接删除所有'|';c++11/14/17需用erase-remove惯用法:s.erase(std::remove(s.begin(), s.end(), '|'), s.end())。

用 std::erase 直接移除所有 '|' 字符(C++20)
如果你的编译器支持 C++20,最简洁安全的方式是直接调用 std::erase。它原地修改字符串,不产生临时对象,语义清晰,且不会因迭代器失效出错。
-
std::erase是容器友好的算法,专为这种“删除所有匹配元素”场景设计 - 比手写
erase–remove惯用法更不易出错,尤其对新手 - 注意:不是所有标准库实现都默认开启 C++20 支持,需确认编译选项(如
-std=c++20)
std::string s = "a|b|c|d"; std::erase(s, '|'); // s 变成 "abcd"
兼容 C++11/14/17 的写法:erase–remove 惯用法
在旧标准下,必须用 std::remove 配合 std::string::erase。关键点在于:std::remove 不真正删除,只重排;漏掉后续的 erase 就会留下脏数据。
- 错误写法:
std::remove(s.begin(), s.end(), '|')—— 这只是返回新逻辑尾迭代器,s内容未变 - 正确顺序必须是:先
remove得到新尾,再用erase截断 - 不能对
std::string用std::remove_if去判断字符是否为'|',除非有额外条件,否则纯属冗余
std::string s = "x|y|z"; s.erase(std::remove(s.begin(), s.end(), '|'), s.end());
逐字符遍历拼接(适合需要过滤逻辑扩展的场景)
如果将来可能不只是删 |,还要跳过空段、去重、或转义处理,那么显式遍历更可控。但要注意性能和内存分配开销。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
reserve()预估容量可避免多次 realloc(例如先统计非|字符数) - 别用
+=循环拼接短字符串——某些 STL 实现下可能退化为 O(n²) - 不要在循环里调用
s[i]同时又修改s长度,容易越界或漏判
std::string s = "a||b|c";
std::string result;
result.reserve(s.size()); // 预分配
for (char c : s) {
if (c != '|') result += c;
}
// result == "abc"
正则替换?谨慎使用
用 std::regex_replace(s, std::regex("\|"), "") 能工作,但绝大多数情况下是杀鸡用牛刀。
- 启动正则引擎开销大,尤其对短字符串或高频调用场景
-
\|中的双反斜杠容易写错(单个|在字符串字面量里会触发转义警告或误解析) - MSVC 和 libstdc++ 对
std::regex的实现稳定性较差,某些版本存在崩溃或匹配异常
除非你已经在用正则做其他复杂模式处理,否则没必要为一个字符引入整套正则依赖。
最常被忽略的是标准版本兼容性判断——项目用的是 C++17 还是 C++20,直接决定该选 std::erase 还是 erase–remove。别想当然认为 CI 环境和本地一致。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










