初始化并设置vector <int> </int>

时间:2013-03-06 03:51:57

标签: c++ vector initialization

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;用于初始化。

6 个答案:

答案 0 :(得分: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

答案 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方法添加元素。