用 erase() 删除指定索引位置的字符最直接:调用 str.erase(idx, 1),但须先检查 idx ≥ 0 且 idx < str.length(),否则越界导致未定义行为。

用 erase() 删除指定索引位置的字符最直接
在 C++ 中,std::string 没有“字符串减法”这个运算符,但删除某个下标处的字符是高频操作,erase() 是标准、安全且高效的做法。它接受起始位置和长度两个参数,删单个字符就传长度为 1。
常见错误是越界访问:比如对空串或索引 ≥ str.length() 调用 erase(),会触发未定义行为(不是抛异常,而是可能崩溃或静默出错)。
- 务必先检查索引有效性:
if (idx >= 0 && idx -
erase()修改原字符串,不返回新串;若需保留原串,请先拷贝 - 索引从 0 开始,
str.erase(0, 1)删首字符,str.erase(str.length()-1, 1)删末字符
用 substr() 拼接实现“无副作用”删除
如果不想修改原字符串,而是想生成一个删掉某位置后的新字符串,substr() 是更清晰的选择。原理是把索引前后的两段子串拼起来。
注意 substr(pos, len) 的第二个参数是长度,不是结束位置;当 pos 超出范围时,substr() 会返回空串,不会崩溃,但结果可能不符合预期。
立即学习“C++免费学习笔记(深入)”;
- 删第
idx个字符:用str.substr(0, idx) + str.substr(idx + 1) -
str.substr(idx + 1)省略长度参数,表示“从 idx+1 到结尾”,安全且简洁 - 性能上比
erase()略低(涉及两次拷贝 + 一次拼接),但语义更明确,适合函数式风格
处理多个索引删除时别用多次 erase()
如果要删多个位置(比如索引 2、5、7),直接循环调用 erase() 很容易出错——因为每次删除都会导致后续字符前移,原始索引失效。
典型错误写法:for (int i : {2,5,7}) s.erase(i,1);,第二次 erase 时索引 5 已经不是原来的位置了。
- 正确做法:先把索引降序排序,再依次删(如 {7,5,2}),这样前面删不影响后面要删的位置
- 或者改用构建新字符串的方式:遍历原串,跳过所有待删索引(用
std::unordered_set存索引可加速查找) - 避免边遍历边修改
string长度,这是最容易被忽略的逻辑坑
注意 std::string::erase() 和 C 风格字符串的区别
C++ 的 erase() 是成员函数,操作的是 std::string 对象;而 C 风格字符串(char*)没有内置删除能力,必须手动移动内存(如用 memmove()),还必须确保目标缓冲区足够大、末尾有 \0。
混用容易出问题:比如把 string.c_str() 传给 erase() 是非法的——c_str() 返回 const 指针,且 erase() 不接受 C 字符串作为参数。
- 坚持用
std::string,别退化到char*手动管理 -
erase()不会改变容量(capacity),只是减少大小(size);如需真正释放内存,可考虑shrink_to_fit() - 在嵌入式或性能敏感场景中,反复
erase()可能引发多次内存重分配,此时预分配或使用std::vector<char></char>更可控


















