C++ “两个独立的”;至于;同一范围内的向量循环,只打印第一个循环

C++ “两个独立的”;至于;同一范围内的向量循环,只打印第一个循环,c++,c++11,vector,C++,C++11,Vector,这是演示代码: #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(); cou

这是演示代码:

#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;
}
#包括
#包括
使用名称空间std;
int main(){
载体a;
a、 推回(1);
a、 推回(2);
a、 推回(3);
a、 推回(4);
a、 推回(5);
int size=a.size();

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


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

这里发生的情况是,您试图通过
操作符[]访问
std::vector
的越界元素
,它执行无边界检查。在引擎盖下,
std::vector
被实现为动态分配内存的连续块(也称为堆)。可以通过
std::vector::capacity()查询分配内存的潜在元素数
并且大于或等于元素的实际数量(std::vector::size()

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

The size of the vector: 5
1
2
3
4
5
32767
12345
因此,
a[5]
返回
32767
,一个“垃圾”值,第二个基于范围的循环运行正常


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

我认为值得一提的是,访问
a[5]
会导致引发异常,并且控制流会跳到块的末尾(即最后一个
}
)否,它不会引发异常。你从哪里得到这个想法的?@sfk92fksdf Undefined Behavior!=引发异常。
at()
引发异常,
运算符[]
不引发异常。允许运算符[]引发异常或执行其他操作。如果编译为debug,IDED VS 2017将抛出一个exeception。For at检查是强制性的。