0
vector<int> v;
v.push_back(0); //you have to do this
//v[0] = 0;     //this gives you an error
v[0] = 1000000; //but now you can set it

那么,为什么第一次初始化一个vector,就得push_back,然后就可以设置了呢?对于原始类型,例如 int,您可以执行 int i = 0; 用于初始化。

4

6 回答 6

5

如果您事先知道向量的大小,则绝对不要使用简单的 push_back() 序列,因为如果您的向量很大(例如,>512 个元素),重新分配可能会浪费时间。

最好这样做:

选项 1:预分配和推送

vector<int> v;
v.reserve(N); // N is the expected size, but right now [0] is undefined. 
for (...) { 
  v.push_back(...);  // No problems in adding more than N elements, but may have to reallocate.        
}

选项 2:调整大小和填充

vector<int> v;
v.resize(N);
for (size_t i=0;i<N;i++)
  v[i] = ...; // You can't write past N-1 here!

选项 3:直接使用正确的大小创建,然后填充

vector<int> v(N);
for (size_t i=0;i<N;i++)
  v[i] = ...; // You can't write past N-1 here!

选项 4:创建一个大小正确的向量并初始化为某个固定值

vector<int> v(N,val); // v[0:N-1] are all equal to val
于 2013-03-06T17:07:43.283 回答
4

因为当你第一次创建一个向量时,它是空的,所以vector[0]不存在。push_back向向量添加一个元素,然后您可以修改或读取它vector[i]

于 2013-03-06T03:54:14.520 回答
3

因为std::vector<int>不是std::map<int, int>

std::vector要求您手动push_back()或(在 C++11 中)emplace_back()将元素包含在集合中。当然,它的一些构造函数允许您在其中包含初始元素。当然还有它的赋值运算符。

subscript( []) 运算符只能用于读取和/或修改现有元素。使用越界(不存在)元素进行索引operator[]会导致未定义的行为

于 2013-03-06T03:54:58.310 回答
3

只是为了让一切 100% 清楚,你的向量声明,

vector<int> v;

在某种意义上类似于变量的声明:

int x;

如果你想要,说,

cout << x;

你会得到垃圾。虽然,如果你声明

int x(2);

一切都会好起来的。同样对于向量:声明

vector<int> v;

为向量分配一些内存空间,但不填充它。然后您可以指定

vector<int> v(2);

这意味着您现在已经声明了一个包含两个元素的向量,或者选择仅向量功能 - push_back。正如您所注意到的,这会将元素添加到您的向量中。

于 2013-03-06T16:35:19.543 回答
0

您无法访问v[0],因为还没有v[0]。向量开始时​​默认构造为空向量。您将一个元素推到背面,它的大小会增加 1。然后您就可以访问刚刚添加的元素。如果您希望它从一个元素开始,请使用适当的构造函数:

std::vector<int> v(1); //one zeroed integer

你在比较苹果和橘子。int i = 0;会像std::vector<int> v;

于 2013-03-06T03:55:05.300 回答
0

您应该首先分配内存用于设置元素值,例如

v.resize(new_size);

或使用push_back方法添加元素。

于 2013-03-06T04:13:40.980 回答