奇怪的C ++ Vector输出

时间:2013-08-13 14:43:58

标签: c++ stdvector

我刚开始使用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.任何帮助都有所帮助。

4 个答案:

答案 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)

您只是初始化向量中的前四个元素,其余的是随机未初始化的内存。