当我在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
一次,程序崩溃了。为什么会这样?我错过了关于矢量与数组连接的一些内容吗?我想知道使用数组处理向量的正确方法,或者使用数组处理向量是不好的做法?
答案 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
调整矢量大小。