同一范围内矢量的两个独立"for"循环,仅打印第一个循环
Two separate "for" loops for vector inside same scope, prints just the first loop
这是演示代码:
#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)。因此,对于大多数实现,您的代码将具有8
a.capacity()
。因此,在实践中,a[5]
不会导致超出分配范围的内存访问,而只是返回在分配的内存位置找到的值。因此,如果我编译并运行您的代码,我会得到
The size of the vector: 5
1
2
3
4
5
32767
12345
因此,a[5]
返回32767
,一个"垃圾"值,第二个基于范围的循环运行良好。
但是,您使用的实现(或std::vector
)在越界访问尝试时可能会有另一种(未定义的)行为。
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- C++ Python 循环"for i, num in enumerate(list):"版本
- C 多循环 for () 基础知识
- 没有条件值的 FOR 循环"for (int i = 1; ; i++)"无法正常工作
- 为用户提供循环for循环的选项
- 打破循环for循环