std :: vector保留后运算符[]上的msvc和gcc之间的行为差​​异,这是对的吗?

时间:2016-10-27 12:01:57

标签: c++

This snippet of code使用msvc(出界错误)失败,但似乎与gcc和clang一起工作正常。什么是正确的行为?

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;
    v.reserve(10);
    for (int i = 0; i < 10; ++i)
    {
        v[i] = i * 2;
    }

    for (int i = 0; i < 10; ++i)
    {
        std::cout << v[i] <<  " ";
    }
    std::cout << std::endl;

    return 0;
}

2 个答案:

答案 0 :(得分:7)

行为未定义。 reserve仅保留内存,但不影响容器的大小。也许你想使用resize

std::vector<int> v;
v.resize(10);
for (int i = 0; i < 10; ++i)
{
    v[i] = i * 2;
}

虽然在这种情况下你可以写

std::vector<int> v(10);
for (int i = 0; i < 10; ++i)
{
    v[i] = i * 2;
}

或者,您可以reservepush_back

一起使用std::vector<int> v; v.reserve(10); for (int i = 0; i < 10; ++i) { v.push_back(i * 2); }
$Spark_bin-2.7> cat abc.scala | ./spark-shell --packages org.apache.spark:spark-streaming-twitter_2.11:1.6.1

答案 1 :(得分:3)

这里有什么未定义的解释:

std::vector<int> v;
v.reserve(10);

reserve仅限&#34;预留&#34;内存但实际上并没有改变矢量的大小。所以当你这样做时

v[i] = i * 2;

您将int写入尚未初始化的地方,因为该向量的大小仍为0。

在这些情况下会发生什么未定义。这里的编译器和库实现可以自由地做他们喜欢的事情。

虽然定义的是 向量 更改reserve(但是resize)但是容量(这是不同的东西)。