我刚开始使用Vectors进行编码,并编写了以下基本代码。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> second(4,100);
cout<<second[0]<<endl;
cout<<second[1]<<endl;
cout<<second[2]<<endl;
cout<<second[3]<<endl;
cout<<second[4]<<endl;
cout<<second[5]<<endl;
cout<<second[6]<<endl;
cout<<second[7]<<endl;
return 0;
}
我得到的输出如下
100
100
100
100
0
135145
0
0
RUN FINISHED; exit value 0; real time: 10ms; user: 0ms; system: 0ms
为什么cout<<second[5]
的输出与其他索引的输出大于3.任何帮助都有所帮助。
答案 0 :(得分:6)
vector<int> second(4,100);
第一个参数告诉构造函数向量的大小,第二个参数是用来填充它的值。
您已经创建了一个大小为4的向量,这意味着最后一个有效元素是second[3]
。除此之外的任何内容都会写入或读出不属于向量的内存中的边界,并调用未定义的行为。
您可以使用push_back
方法在最后安全地追加元素。
答案 1 :(得分:2)
您创建一个包含4个元素的向量,这些元素初始化为100。 那时:
cout<<second[4]<<endl;
你用完了界限,这是未定义的行为。
答案 2 :(得分:1)
你正在使用的std::vector
's constructor接受两个参数 - 计数和值。在您的情况下,您正在创建一个包含4个元素的向量。但是,您尝试访问8个元素。这会触发undefined behavior。
一个有趣的事实是operator[](size_type)
没有检查允许你触发UB的有效范围,std::vector::at()
方法会这样做,并且如果索引超出范围会抛出异常。
答案 3 :(得分:0)
您只是初始化向量中的前四个元素,其余的是随机未初始化的内存。