You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:39:03