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; 用于初始化。
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; 用于初始化。
如果您事先知道向量的大小,则绝对不要使用简单的 push_back() 序列,因为如果您的向量很大(例如,>512 个元素),重新分配可能会浪费时间。
最好这样做:
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.
}
vector<int> v;
v.resize(N);
for (size_t i=0;i<N;i++)
v[i] = ...; // You can't write past N-1 here!
vector<int> v(N);
for (size_t i=0;i<N;i++)
v[i] = ...; // You can't write past N-1 here!
vector<int> v(N,val); // v[0:N-1] are all equal to val
因为当你第一次创建一个向量时,它是空的,所以vector[0]
不存在。push_back
向向量添加一个元素,然后您可以修改或读取它vector[i]
因为std::vector<int>
不是std::map<int, int>
。
std::vector
要求您手动push_back()
或(在 C++11 中)emplace_back()
将元素包含在集合中。当然,它的一些构造函数允许您在其中包含初始元素。当然还有它的赋值运算符。
subscript( []
) 运算符只能用于读取和/或修改现有元素。使用越界(不存在)元素进行索引operator[]
会导致未定义的行为。
只是为了让一切 100% 清楚,你的向量声明,
vector<int> v;
在某种意义上类似于变量的声明:
int x;
如果你想要,说,
cout << x;
你会得到垃圾。虽然,如果你声明
int x(2);
一切都会好起来的。同样对于向量:声明
vector<int> v;
为向量分配一些内存空间,但不填充它。然后您可以指定
vector<int> v(2);
这意味着您现在已经声明了一个包含两个元素的向量,或者选择仅向量功能 - push_back。正如您所注意到的,这会将元素添加到您的向量中。
您无法访问v[0]
,因为还没有v[0]
。向量开始时默认构造为空向量。您将一个元素推到背面,它的大小会增加 1。然后您就可以访问刚刚添加的元素。如果您希望它从一个元素开始,请使用适当的构造函数:
std::vector<int> v(1); //one zeroed integer
你在比较苹果和橘子。int i = 0;
会像std::vector<int> v;
。
您应该首先分配内存用于设置元素值,例如
v.resize(new_size);
或使用push_back
方法添加元素。