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
相关产品推荐
相关产品推荐

