C++中如何删除vector内除最后一个元素外的其余所有元素
问题原因
std::vector::erase(first, last)遵循左闭右开区间规则,会删除从first(包含)到last(不包含)的所有元素。你现有代码传入begin()到end(),等于删除整个vector的全部元素,自然不会有剩余内容。erase只支持传入正向迭代器,反向迭代器rbegin()、rend()和正向迭代器类型不兼容,直接传参会编译报错。- 你写的遍历循环条件
i<=epos.size()存在越界问题:vector的合法索引范围是0 ~ epos.size()-1,用<=会访问到不属于vector的内存,属于未定义行为。
正确实现(用erase保留最后一个元素)
你需要删除的区间是从开头到最后一个元素之前的所有元素,对应的区间是[epos.begin(), epos.end()-1),代码如下:
#include <vector> #include <iostream> using namespace std; vector<int> epos = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; int main() { // 先判空避免空vector调用end()-1出现未定义行为 if (!epos.empty()) { epos.erase(epos.begin(), epos.end() - 1); } // 修正遍历逻辑 for (int i=0; i<epos.size(); i++) { cout << epos[i] << ' '; } return 0; }
运行后输出结果为11 ,符合预期。
更简洁的替代方案
如果你不强制要求必须用erase实现,还有两种写法更易读:
- 方案1:直接把最后一个元素赋值给当前vector
if (!epos.empty()) { epos = {epos.back()}; } - 方案2:取出最后一个元素,清空vector后重新插入
if (!epos.empty()) { int last = epos.back(); epos.clear(); epos.push_back(last); }
内容的提问来源于stack exchange,提问作者PYPY
相关产品推荐
相关产品推荐

