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

C++ vector erase函数使用疑问:遍历输出结果不符合预期

问题分析与解决

让我们一步步拆解你遇到的问题:

核心原因:数组越界导致的未定义行为

你在执行v1.erase(v1.begin()+2)之后,v1的容器大小已经从11(10个50 + 1个22)变成了10(9个50 + 1个22)。但你后续的for循环依然用i<11作为终止条件,这就意味着你会访问v1[10]——这个位置已经超出了容器的有效元素范围,属于C++中的未定义行为。

C++标准并不会强制检查容器的越界访问,此时程序会读取内存中该位置的残留值(刚好是你之前插入的22),但这完全是随机的——换个环境运行,你可能会得到其他奇怪的数值,甚至程序直接崩溃。这就是你看到输出多了一个22的根本原因。

次要问题:冗余的重复操作

你的代码里重复执行了两遍v1.assign(10,50); v1.insert(v1.end(),22);,这会让第一次的初始化操作被完全覆盖,虽然这不是导致输出错误的直接原因,但会让代码逻辑变得混乱,建议去掉重复的部分。

修正后的代码示例

#include <iostream>
#include <vector>
using namespace std;

template<typename T>
void print(const vector<T>& v) {
    for (const auto& elem : v) {
        cout << elem << " ";
    }
    cout << endl;
}

int main() {
    vector<int> v1;
    // 只执行一次初始化与插入操作
    v1.assign(10, 50); 
    v1.insert(v1.end(), 22); 
    cout << "v1 未删除元素前:" << endl; 
    print(v1); // 输出:50 50 50 50 50 50 50 50 50 50 22

    v1.erase(v1.begin() + 2); // 删除第3个元素(索引为2)
    cout << "v1 删除元素后:" << endl;
    
    // 正确方式1:用容器的size()控制循环,避免硬编码
    for (size_t i = 0; i < v1.size(); ++i) {
        cout << v1[i] << " ";
    }
    cout << endl;

    // 更推荐的方式2:范围for循环(C++11及以上支持),彻底避免越界
    cout << "用范围for遍历:" << endl;
    for (int elem : v1) {
        cout << elem << " ";
    }
    cout << endl;

    return 0;
}

关键修正点

  • 移除了重复的初始化代码,确保逻辑单一清晰;
  • 用v1.size()代替硬编码的11来控制循环,保证只遍历容器内的有效元素;
  • 推荐使用范围for循环,这种写法不需要手动管理索引,从根源上避免了越界问题。

内容的提问来源于stack exchange,提问作者SGoodman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:27:10