是否可以使用没有push_back的数组初始化向量的新位置(C ++ STL)

时间:2017-10-06 13:27:43

标签: c++ stl

当我在C ++中使用vector进行实验时,我遇到了一些奇怪的问题。可能是因为我对C ++ STL知之甚少。我正在使用具有GNU GCC编译器的Code :: Blocks 16.01 IDE。

当我运行此代码时:

vector <int> vec;

vec.push_back(66);
vec.push_back(12);

cout << vec[1] << endl;
  

输出显然是正确的,即12

再次,当我运行此代码时:

vector <int> vec;

vec.push_back(66);
vec.push_back(12);

vec[1] = 18;

cout << vec[1] << endl;
  

这次输出也是正确的,即18

这次我只为{2}元素做了push_back()。但是使用数组并在运行以下代码后初始化第6个元素的值:

vector <int> vec;

vec.push_back(66);
vec.push_back(12);

vec[5] = 18;

cout << vec[5] << endl;
  

输出再次正常,即18

但是,当我运行下面的代码时,控制台窗口立即崩溃。我不知道为什么。

vector <int> vec;

vec.push_back(66);
vec.push_back(12);

cout << vec[1] << endl;

vec[5] = 18;

cout << vec[5] << endl;

一旦我使用cout一次,程序崩溃了。为什么会这样?我错过了关于矢量与数组连接的一些内容吗?我想知道使用数组处理向量的正确方法,或者使用数组处理向量是不好的做法?

2 个答案:

答案 0 :(得分:3)

  

我错过了关于vector与数组连接的一些内容吗?

不,不。如果你对数组的行为方式不一样,你会遇到同样的问题:

int array[2];
array[5] = 18; // this is undefined behaviour
std::cout << array[5] << std::endl; // this is undefined behaviour as well

您甚至可以在某些环境中看到所需的输出,但它可能会在另一个环境中崩溃,或者在您更改代码时开始崩溃。这是UB的问题 - 这是不可预测的。访问超出范围的元素与数组和std::vector具有相似的后果,差异 - 您可以调整std::vector的大小但不能对数组执行此操作。

答案 1 :(得分:2)

当您访问超出向量大小的std::vector元素时,您会得到未定义的行为。未定义的行为意味着什么 - 任何事情都可能发生。这就是为什么有时你的程序会崩溃,有时候它运行正常。你不应该依赖任何未定义的行为,而应该在插入超出矢量大小的东西之前使用std::vector::resize调整矢量大小。