最直接的办法是调用 erase(k-1, 1),因下标从0开始,第k个字符对应索引k-1;需先检查k是否有效(1≤k≤s.size()),否则行为未定义;erase原地操作、高效安全,优于substr拼接。

用 std::string::erase 直接删第k个字符
最直接的办法就是调用 erase,传入下标 k 和长度 1。注意:C++ 字符串下标从 0 开始,所以“第k个字符”对应索引 k-1,但实际编码中更常见的是按索引操作——如果你拿到的是“第k个”(即人类计数),得先检查 k >= 1 && k ,再转成 <code>k-1。
示例:
std::string s = "hello";
int k = 3; // 想删第3个字符 'l'(索引2)
if (k >= 1 && k (s.length())) {
s.erase(k - 1, 1);
}
删完后 s 变成 "helo"。不检查边界会触发未定义行为(比如 erase(100, 1) 在 debug 模式下可能抛 std::out_of_range)。
用迭代器配合 erase 删除第k个位置
如果习惯用迭代器,可以用 s.begin() + k 定位,但同样要注意:这里的 k 是索引(0 起始),不是“第k个”。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
s.erase(s.begin() + k)等价于s.erase(k, 1),只是写法不同 - 若
k超出范围(如k >= s.size()),行为未定义——不会自动截断或静默失败 - 对
std::string,随机访问迭代器是高效的,begin() + k是 O(1),不是遍历
为什么不能用 substr 拼接来删?
有人会想:取前 k-1 个 + 后面从 k 开始的部分。这可行,但没必要且有隐患:
- 写法啰嗦:
s = s.substr(0, k-1) + s.substr(k) - 两次
substr都要分配新内存,再拼接又分配一次,性能差于原地erase - 如果
k == 0或k == s.length(),substr参数容易越界(substr(pos, n)中pos > size()会抛异常) -
erase是标准、安全、高效的做法,别绕远路
处理 std::string_view 时不能直接删
std::string_view 是只读视图,没有 erase 方法。如果你拿到的是 string_view 却想“删第k个”,本质是要构造一个新字符串:
std::string_view sv = "world";
int k = 2; // 删第2个字符 'o' → 索引1
if (k >= 1 && k (sv.length())) {
std::string result = std::string(sv.substr(0, k-1)) +
std::string(sv.substr(k));
}
注意:这里必须显式转成 std::string 才能拼接;string_view 本身无法修改,任何“删除”都是生成副本。别误以为 sv.remove_prefix 或 remove_suffix 能删中间字符——它们只能切头尾。
真正容易被忽略的点是:k 的语义到底是“第几个”还是“索引几”。混用会导致 off-by-one 错误,而且这种 bug 在测试用例覆盖不全时很难暴露——比如只测了 k=1 和 k=末尾,漏掉中间值,运行时就崩了。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










