C++ vector范围for循环报错原因及简洁遍历方法咨询
问题分析与解决方案
兄弟,你这问题核心是误解了范围for循环的变量含义,咱们一步步拆解:
为什么程序会报错?
你在范围for循环里把i当成了数组索引,但实际上,范围for循环中的i是容器里的元素本身的值,不是索引!
举个具体的例子:
- 初始
myVec是[1,2,3],第一次循环时,i依次取1、2、3,你用myVec[i-1]刚好能对应到正确的元素,纯属巧合; - 移除首元素后,
myVec变成[2,3],第二次循环时,i先取2,你用myVec[2-1]拿到3,看起来没问题,但下一个i取3时,myVec[3-1]就是访问索引2的位置——可此时容器只有2个元素,索引最大是1,直接触发了数组越界访问,程序自然报错。
修正后的代码
把循环里的myVec[i-1]改成直接输出i就行,因为i就是你要遍历的元素:
#include <iostream> #include <vector> #include <string> using namespace std; void removeFirstFromVec(vector<int> & vecLink) { // 移除首元素可以简化成begin(),不用+0 vecLink.erase(vecLink.begin()); } int main() { vector<int> myVec; myVec.push_back(1); myVec.push_back(2); myVec.push_back(3); cout << "Before removal\n"; for (auto & i : myVec) { cout << i << endl; // 直接输出元素本身 } removeFirstFromVec(myVec); cout << "After removal\n"; for (auto & i : myVec) { cout << i << endl; // 直接输出元素本身 } return 0; }
无需传统索引循环的简洁遍历方式
当然有!你本来用的范围for循环就是最简洁的,只要用对就行。另外还有两种常用的简洁写法:
1. 只读元素用const auto &
如果只是读取元素,用const auto &能避免不必要的拷贝,效率更高:
for (const auto& num : myVec) { cout << num << endl; }
2. std::for_each + Lambda
如果要对元素执行更复杂的操作,这种写法很灵活(需要包含<algorithm>头文件):
#include <algorithm> // ... std::for_each(myVec.begin(), myVec.end(), [](int num) { cout << num << endl; });
不过对于简单的遍历输出,范围for循环绝对是最直观、最省心的选择。
内容的提问来源于stack exchange,提问作者WhoAmI
相关产品推荐
相关产品推荐

