c++20起可用std::erase(s, '|')一行删除所有竖线;此前需std::remove+erase;需无副作用时用std::copy_if配合reserve;避免低效的replace或regex_replace。

用 std::erase 直接移除所有 |
C++20 起,std::string 支持 std::erase 这个便捷函数,一行就能删光所有竖线:
std::string s = "a|b|c|d"; std::erase(s, '|');它内部自动调用
erase-remove 惯用法,安全高效。注意:必须是 C++20 或更高标准,否则编译报错 ‘erase’ is not a member of ‘std’。
兼容 C++11/14/17 的写法:用 std::remove + erase
老标准下得手动组合:
std::string s = "a|b|c|d"; s.erase(std::remove(s.begin(), s.end(), '|'), s.end());这里
std::remove 不真删,只是把非 | 元素往前挪,并返回新逻辑尾迭代器;后续 erase 才真正截断。漏掉 s.end() 会导致未定义行为,常见错误。
如果要保留原字符串、生成新结果,别用就地修改
上面两种都是改原串。若需无副作用地生成新字符串(比如函数式处理或 const 输入),推荐 std::copy_if:
std::string s = "a|b|c|d";
std::string cleaned;
cleaned.reserve(s.size()); // 预分配避免多次 realloc
std::copy_if(s.begin(), s.end(), std::back_inserter(cleaned),
[](char c) { return c != '|'; });注意:没预分配 reserve 时,短字符串影响不大,但长文本(如几 MB 日志)反复 push_back 会明显拖慢。
别用 replace 或正则——除非真需要模式匹配
有人想用 std::string::replace 或 std::regex_replace 替换 "|" 为空串,这完全没必要:
-
replace只能替换固定位置子串,遍历找所有|再逐个 replace 效率低且易出界 -
std::regex_replace(s, std::regex("\|"), "")开销大,启动正则引擎比遍历字符慢一个数量级,纯字符剔除毫无优势
实际写的时候,先确认编译器支持的 C++ 标准;C++20 优先用 std::erase,否则走 remove + erase;传入 const 引用或需不可变语义时,记得用 copy_if 配 reserve。竖线本身没有特殊转义含义,不用加反斜杠——这点和正则或 shell 里不同。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











