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;
}
答案 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;
}
或者,您可以reserve
与push_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
)但是容量(这是不同的东西)。