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
那么,为什么第一次初始化一个向量,你必须推送回来,之后你可以设置它吗?对于基本类型,比如int,你可以做int i = 0;用于初始化。
答案 0 :(得分:5)
如果您事先知道矢量的大小,最后不使用普通的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
答案 1 :(得分:4)
因为当你第一次创建一个向量时它是空的,所以vector[0]
不存在。 push_back
向向量添加元素,然后您可以使用vector[i]
答案 2 :(得分:3)
因为std::vector<int>
不是std::map<int, int>
。
std::vector
要求您手动push_back()
或(在C ++ 11中)emplace_back()
元素,以便将它们包含在集合中。当然,它的一些构造函数允许您包含初始元素。当然还有它的赋值运算符。
下标([]
)运算符只能用于读取和/或修改现有的元素。使用operator[]
越界(不存在)元素进行索引将导致未定义的行为。
答案 3 :(得分:3)
只是为了让所有内容100%清晰,你的向量声明,
vector<int> v;
在某种意义上类似于变量的声明:
int x;
如果你想要,那么,
cout << x;
你会得到垃圾。但是,如果你宣布
int x(2);
一切都会好的。对于向量类似:的声明
vector<int> v;
为向量分配一些内存空间,但不填充它。然后,您可以指定
vector<int> v(2);
这意味着您现在已经声明了两个元素的向量,或者转到仅向量的特征 - push_back。正如您所注意到的,这会向您的向量添加元素。
答案 4 :(得分:0)
您无法访问v[0]
,因为还没有v[0]
。向量默认构造为空向量。您将一个元素推到后面,它的大小增加1.然后您就可以访问刚刚添加的元素。如果您希望从一个元素开始,请使用适当的构造函数:
std::vector<int> v(1); //one zeroed integer
你在比较苹果和橘子。 int i = 0;
就像std::vector<int> v;
。
答案 5 :(得分:0)
首先应该为设置元素值分配内存,例如
v.resize(new_size);
或使用push_back
方法添加元素。