boost::algorithm::erase_all()用于原地删除字符串中所有指定子串,仅支持字面量匹配,需包含,参数为(std::string&, const std::string&),不可传空串,时间复杂度o(n×m)。

boost::algorithm::erase_all() 删除所有匹配子串
直接用 boost::algorithm::erase_all() 最省事,它原地修改字符串,不返回新对象。注意它只删字面量,不支持正则;如果要删多个不同子串,得调用多次或自己循环。
- 头文件必须包含
#include <boost></boost> - 参数顺序是
(std::string&, const std::string&),第二个是待删的子串,不能传空字符串,否则触发断言失败 - 对
std::wstring也适用,但需确保两个参数类型一致(都用wstring) - 性能上是 O(N×M),M 是子串长度,频繁删长子串时要注意
std::string s = "abcbcdabc"; boost::algorithm::erase_all(s, "bc"); // 结果: "ad"
boost::algorithm::erase_first() 和 erase_last()
当只需要删第一个或最后一个匹配项时用这两个,比 erase_all() 更轻量,内部用 std::search 找位置后调用 string::erase(),不会遍历全文。
-
erase_first()找到首个匹配就停,erase_last()会从后往前扫描,效率略低但语义明确 - 若没找到匹配项,字符串不变,函数不报错也不返回状态,得自己用
boost::algorithm::find_first()预判 - 它们不改变原字符串的容量(capacity),只是缩短 size,适合后续反复复用同一 buffer 的场景
std::string s = "xabcxabcx"; boost::algorithm::erase_first(s, "abc"); // → "xxabcx" boost::algorithm::erase_last(s, "abc"); // → "xxax"
用 boost::algorithm::find_iterator 处理复杂删除逻辑
当要按规则删(比如“删掉第2个和第4个匹配项”,或“删掉长度大于3的连续数字串”),就得用迭代器方案。它把查找和删除解耦,灵活性高,但代码稍多。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
boost::algorithm::make_find_iterator()返回一个迭代器范围,每个元素是iterator_range<it></it>,代表一次匹配的位置 - 必须反向遍历这些 range 再调用
string::erase(),否则删前面会影响后面 range 的有效性 - 别直接在正向循环里 erase,会导致迭代器失效或越界访问
- 适用于需要保留匹配上下文、或配合其他 Boost 算法(如
is_digit())做条件判断的场景
std::string s = "a123b456c789"; auto it = boost::algorithm::make_find_iterator(s, boost::algorithm::digit()); // 要删第2个数字段:先收集所有 range,再反向删索引为1的那个
和 std::string::erase() 混用时的常见坑
Boost 字符串算法底层仍依赖 std::string::erase(),但封装层隐藏了迭代器有效性细节,混用容易出问题。
- 不要在同一个字符串上交替调用
boost::algorithm::erase_xxx()和手动s.erase(pos, len)后又继续用 Boost 函数——中间插入的 erase 可能导致 Boost 内部缓存的位置偏移 - Boost 函数不检查输入字符串是否为
const引用,传入临时对象(如func(s + "x"))会导致编译失败或未定义行为 - 在 C++17 以后,如果字符串启用了 SSO(短字符串优化),大量小删操作可能比预分配内存更慢,此时建议先
s.reserve()避免反复 realloc
真正麻烦的是嵌套删除逻辑——比如删完 A 再根据剩余内容决定删 B,这时最好把 Boost 查找结果存成位置列表,统一处理,而不是链式调用 erase 函数。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










