2

我刚开始使用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

4 回答 4

6
vector<int> second(4,100);

第一个参数告诉构造函数向量的大小,第二个参数告诉构造函数应该用来填充它的值。

您创建了一个大小为 4 的向量,这意味着最后一个有效元素是second[3]. 除此之外的任何内容都会越界写入或读取不属于向量的内存并调用未定义的行为。

您可以使用push_back方法在末尾安全地附加元素。

于 2013-08-13T14:46:13.367 回答
2

您创建一个包含 4 个元素的向量,这些元素初始化为 100。此时:

cout<<second[4]<<endl; 

您超出了界限,这是未定义的行为。

于 2013-08-13T14:46:59.480 回答
1

您正在使用的std::vector's 构造函数接受两个参数 - 计数和值。在您的情况下,您正在创建一个包含 4 个元素的向量。但是,您正在尝试访问 8 个元素。这会触发未定义的行为

一个有趣的事实是,whileoperator[](size_type)不会检查允许您触发 UB 的有效范围,std::vector::at()方法会检查,如果索引超出范围,则会抛出异常。

于 2013-08-13T14:46:54.113 回答
0

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

于 2013-08-13T14:47:02.463 回答