c++20起可用std::erase(s, '|')一行删除所有竖线;低版本需用std::remove_if+erase组合;替换竖线用std::replace;注意编译标准、类型匹配及unicode限制。

用 std::erase 直接移除所有 '|'
C++20 起,std::string 支持 std::erase,一行就能删光所有竖线,不用手写循环或 remove_if。它内部调用 erase-remove 惯用法,但封装得干净:
std::string s = "a|b|c||d"; std::erase(s, '|'); // s 变成 "abcd"
注意:必须是 C++20 或更高标准;低版本会编译失败。不是所有编译器默认开 C++20,比如 GCC 需加 -std=c++20,MSVC 也要确认语言标准设置。
兼容老标准:用 std::remove_if + erase
C++11 到 C++17 必须手动组合 remove_if 和 erase。关键点是 remove_if 不真删,只把要留的元素前移,返回新逻辑尾迭代器,必须配 erase 才生效:
std::string s = "x|y|z|";
s.erase(std::remove_if(s.begin(), s.end(), [](char c) { return c == '|'; }), s.end());
常见错误:
- 只调用
std::remove_if忘了erase→ 字符串长度不变,末尾残留垃圾字符 - 写成
s.remove_if(...)→std::string没这个成员函数,编译报错 - 用
==比较时写成c == "|"(字符串字面量)→ 类型不匹配,编译失败,得用单引号'|'
想替换为其他字符?别用 erase,改用 std::replace
如果目标不是“去掉”,而是“把竖线换成空格/逗号/空字符串”,std::replace 更直接:
std::string s = "1|2|3"; std::replace(s.begin(), s.end(), '|', ','); // 变成 "1,2,3"
但注意:std::replace 只能换为单个字符,不能换为多字符(如 " ")或空字符串。要实现“替换为空”,还是得走 erase 路线。
性能和边界情况提醒
三种方法在小字符串上没区别,但大数据量时要注意:
-
std::erase和remove_if+erase都是 O(n),实际速度接近 - 避免对长字符串反复调用 —— 比如在循环里对同一字符串多次
erase竖线,每次都是全扫描 - 空字符串、全是竖线(如
"|||")、开头结尾有竖线 —— 这些情况所有方法都正确处理,无需额外判空 - 如果字符串来自用户输入或文件,且含 Unicode(如 UTF-8 编码的中文),竖线仍是 ASCII
'|',不影响;但别误以为这方法能处理 Unicode 分隔符(如 U+FF5C 全角竖线)
真正容易被忽略的是标准版本检查 —— 写了 std::erase 却在 C++17 项目里编译不过,报错信息又不直说缺标准,卡半天才想到改编译选项。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











