c++oding="utf-8" ?>
最常用方式是用 std::string::find 定位再 erase,需检查 npos 防未定义行为;删全部时应从上次位置继续 find 而非重置为 0,避免死循环或漏删;空字符串需提前校验;性能敏感场景建议构建新字符串或用 replace 替代多次 erase。

用 std::string::find + std::string::erase 删除第一个匹配子串
最常用也最直接的方式:先定位子串起始位置,再擦除。注意 find 返回 std::string::npos 表示未找到,必须检查,否则传给 erase 会触发未定义行为。
典型写法:
std::string s = "hello world hello";
std::string to_remove = "hello";
size_t pos = s.find(to_remove);
if (pos != std::string::npos) {
s.erase(pos, to_remove.length());
}
// 结果: " world hello"
-
erase(pos, len)的len是要删的字符数,不是结束位置 - 只删第一个匹配;想删全部需循环调用(见下一条)
- 若
to_remove为空字符串,find总返回0,导致无限循环或意外截断 —— 务必提前校验非空
循环删除所有连续出现的指定子串
多次调用 find 时,不能每次都从 0 开始找,否则会重复匹配已处理过的部分(比如删完前一个后,新字符串开头又出现相同子串),导致死循环或漏删。
正确做法是每次从上一次删除位置开始搜索:
std::string s = "ababababc";
std::string to_remove = "ab";
size_t pos = 0;
while ((pos = s.find(to_remove, pos)) != std::string::npos) {
s.erase(pos, to_remove.length());
// 不加 pos += to_remove.length(),因为 erase 后后续内容前移
// 下次 find 自动从当前 pos 继续(即原位置,现在已是新字符)
}
- 省略
pos += ...是关键:删除后字符串变短,同一索引位置已指向新字符,继续从该位置找即可 - 如果误加
pos += to_remove.length(),可能跳过紧邻的重叠匹配(如删 "aaa" 中的 "aa",连续两个 "aa" 会漏掉第二个) - 性能敏感场景慎用:每次
erase都涉及内存搬移,大量删除建议改用std::string::replace或构建新字符串
用 std::regex_replace 替换为 "" 实现删除
适合需要正则语义(如忽略大小写、通配、边界控制)的场景,但开销明显高于纯字符串查找。普通字面量删除不推荐此方式。
基础用法:
std::string s = "Hello HELLO hello";
std::string result = std::regex_replace(s, std::regex("HELLO"), "");
// 注意:默认区分大小写;如需忽略,用 std::regex_constants::icase
-
std::regex构造失败会抛std::regex_error,生产环境必须捕获 - 正则引擎对短字符串效率低,且 C++11 起 regex 实现质量参差不齐(MSVC 较慢,libstdc++ 有 bug 历史)
- 无法控制“只删第一个”或“不删重叠部分”,行为由正则引擎定义,不如手动控制精确
避免修改原字符串:构造新字符串跳过目标子串
当原字符串不可修改、或频繁删除导致性能瓶颈时,更安全高效的做法是遍历原串,把不匹配的部分拼到新串里。
示例(删除所有 "xyz"):
std::string s = "axyzbxyzc"; std::string to_remove = "xyz"; std::string result; result.reserve(s.length()); // 预分配避免多次 realloc for (size_t i = 0; i
-
substr在循环内调用要注意越界:必须先判断长度是否足够 - 用
reserve显式预分配可显著提升性能,尤其大字符串 - 相比反复
erase,这种方式内存操作更局部,CPU 缓存友好
真正容易被忽略的是:子串重叠时的行为差异。比如在 "aaaa" 中删 "aa",find+erase 循环默认删的是位置 0 和 2(得到 "aa"),而手写遍历逻辑可以自由决定是否允许重叠匹配。实际需求里这点常被当成理所当然,结果线上数据出错才意识到。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











