“偶数位置”指从1开始计数的位置编号为偶数的字符,即索引i对应的物理位置为i+1,故偶数位置等价于i%2==1;实际需保留的是奇数位置字符(i%2==0)。

什么是“偶数位置”?先明确索引起点
很多人一上来就写 for (int i = 0; i ,结果删掉的是第 0、2、4… 位——也就是“索引为偶数”的字符。但题目说的“偶数位置”,通常指人类计数习惯:第 1 位是奇数位置,第 2 位是偶数位置,即索引 <code>1、3、5…(从 1 开始数的位置对应索引 i-1)。务必确认需求:删除的是位置 2、4、6… 的字符,不是索引 0、2、4… 的字符。
用反向遍历 + erase 避免下标错乱
正向边遍历边删会改变后续字符索引,导致跳删或越界。安全做法是从后往前删:
- 遍历索引
i从字符串末尾开始,每次减 2,起始点取决于“偶数位置”的定义 - 若按“位置从 1 开始”,偶数位置对应索引
1, 3, 5, ...,最大合法索引是s.length() - 1;若长度为偶数,最后一个偶数位置索引就是s.length() - 1;若为奇数,则是s.length() - 2 - 所以起始索引可设为
s.length() % 2 == 0 ? s.length() - 1 : s.length() - 2,然后i -= 2直到i >= 1
示例:
std::string s = "abcdef";
for (int i = (s.length() % 2 == 0 ? s.length() - 1 : s.length() - 2); i >= 1; i -= 2) {
s.erase(i, 1);
}
执行后 s 变为 "ace"(删了位置 2→'b'、4→'d'、6→'f')。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
更简洁安全的做法:构建新字符串
比原地修改更直观、无副作用,也避免 erase 的迭代器失效风险:
- 遍历原字符串,对每个索引
i(从 0 开始),判断其“位置”是否为偶数:位置 =i + 1,所以偶数位置 ⇔(i + 1) % 2 == 0⇔i % 2 == 1 - 只保留
i % 2 == 0的字符(即位置 1、3、5…) - 用
std::string result累加即可
代码片段:
std::string s = "abcdef"; std::string result; for (size_t i = 0; i <h3>注意 <code>std::string::erase</code> 的参数陷阱</h3><p><code>erase(pos, count)</code> 中 <code>pos</code> 是索引,<code>count</code> 是要删的字符数。常见错误:</p>
- 写成
s.erase(i)(单参数)→ 删除从i开始到末尾的所有字符,不是只删一个 -
pos超出范围(如i >= s.length())会抛std::out_of_range - 空字符串时
s.length()为 0,反向循环条件i >= 1自动不触发,没问题;但若误写成i >= 0,则i=0时尝试删位置 0(即第 1 位),违背“删偶数位置”本意
边界永远多想一次:输入是空串、单字符、两字符时,结果是否符合预期?
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










