用erase()删指定索引字符最直接:str.erase(pos)等价于str.erase(pos,1),需确保pos<str.size(),否则抛std::out_of_range;删多字符用erase(pos,count)更高效;不改原串则用substr(0,pos)+substr(pos+1)。

用 erase() 直接删指定索引位置的字符
最直接的方式是调用 std::string::erase(),传入起始位置和删除长度(1 即可)。它修改原字符串,不生成新对象,效率高且语义清晰。
-
str.erase(pos)等价于str.erase(pos, 1),从pos开始删 1 个字符 -
pos必须满足pos < str.length(),否则触发std::out_of_range - 注意:
pos是下标(从 0 开始),不是迭代器;若用迭代器,得写str.erase(str.begin() + pos) - 删完后字符串自动收缩,后续字符前移,
length()减 1
删多个连续位置?用 erase(pos, count)
如果要删一段连续子串(比如位置 2 到 5 共 4 个字符),直接传长度更安全,比循环调用 erase() 高效得多。
-
str.erase(2, 4)删除索引 2、3、4、5 四个字符(含头不含尾) -
count超出剩余长度时,实际只删到末尾,不会报错(C++11 起行为) - 别写成
str.erase(2, 5)以为删“到位置 5”,实际删的是从 2 开始的 5 个字符
删之前务必检查索引合法性
越界访问在 Debug 模式下可能崩溃或断言失败,Release 下行为未定义。尤其当 pos 来自用户输入、计算结果或容器 size 时,必须校验。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 正确写法:
if (pos < str.size()) str.erase(pos); - 错误写法:
str.erase(pos)不加判断 —— 即使str为空,pos == 0也会崩 - 注意
size()和length()等价,但empty()比size() == 0更推荐用于判空
想保留原字符串?那就用 substr() 拼接
如果不想修改原串,而是生成新字符串(比如函数返回值场景),用 substr() 切前后两段再拼接更直观。
立即学习“C++免费学习笔记(深入)”;
-
str.substr(0, pos) + str.substr(pos + 1)—— 注意第二个substr起始是pos + 1,不是pos - 当
pos == 0时,substr(0, 0)返回空串,没问题;当pos == str.length()-1,substr(pos+1)返回空串,也没问题 - 性能略低于
erase()(涉及两次内存分配和拷贝),但语义更函数式,适合不可变场景
std::out_of_range 或静默错位。写的时候多看一眼 pos < str.size(),比事后 debug 快得多。

















