同一范围内矢量的两个独立"for"循环,仅打印第一个循环

Two separate "for" loops for vector inside same scope, prints just the first loop

本文关键字:循环 for 独立 第一个 打印 两个 范围内      更新时间:2023-10-16

这是演示代码:

#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> a;
a.push_back(1);
a.push_back(2); 
a.push_back(3);
a.push_back(4);
a.push_back(5);
int size = a.size();
cout << "The size of the vector: " << size << "n";
for (auto i = 0; i != 6; i++) {
cout << a[i] << endl;
}
//Based on range based for loop
for (auto j : a) {
cout << j ;
}
return 0;
}

运行后,第一个循环打印矢量值。然后第二个循环跳过(没有任何条件)。

这很奇怪[可能不是?

有人可以解释一下这种行为吗?

您的代码具有未定义的行为。

您正在访问第一个循环中的a[5],这超出了范围

这里发生的事情是,您尝试通过其operator[]访问std::vector的越界元素,该元素执行无边界检查。在后台,std::vector被实现为动态分配的内存的连续块(也称为)。已分配内存的潜在元素数可以通过std::vector<>::capacity()查询,并且大于或等于实际的元素数(std::vector<>::size())。

当添加新元素超过现有容量时,大多数std::vector<>::push_back()的实现会将容量加倍(或将其设置为 1)。因此,对于大多数实现,您的代码将具有8a.capacity()。因此,在实践中,a[5]不会导致超出分配范围的内存访问,而只是返回在分配的内存位置找到的值。因此,如果我编译并运行您的代码,我会得到

The size of the vector: 5
1
2
3
4
5
32767
12345

因此,a[5]返回32767,一个"垃圾"值,第二个基于范围的循环运行良好。

但是,您使用的实现(或std::vector)在越界访问尝试时可能会有另一种(未定义的)行为。