C++ c++;向量插入意外行为

C++ c++;向量插入意外行为,c++,vector,insert,C++,Vector,Insert,请解释以下代码按预期工作的原因(元素添加在第2个位置): 标准:向量v(5); 对于(int i=0;i“代码> INSERT < /CER>让您在中间添加一个新的项,并且 PuxSuffe让您在末尾添加一个。其他容器,如 DeQue/代码>也有 PursProf 谢谢,有没有办法将元素添加到一个向量中?我使用了代码>保留(n)而不是push\u back,因为push\u back很慢。在保留空间后push\u back会加速吗?有多慢?@SkyRipper:如果你使用reserve()设置

请解释以下代码按预期工作的原因(元素添加在第2个位置):

标准:向量v(5); 对于(int i=0;i<5;i++) v[i]=i; std::vector::iterator it=v.begin()+1; it=v.插入(it,33);
这是一种未定义的行为
std::vector::reserve
不会调整向量大小,因此调用
v[i]
是一种越界访问

您需要调用
v.resize(5)
来展开向量以容纳5个元素,或者在循环内调用
v.push_

std::vector<int> v(5);
这将正确地创建一个5个元素的向量(当您在分配向量时最初不知道向量的大小时,可以使用它)

std::vector v;
v、 储备(5);
对于(int i=0;i<5;i++)
v、 推回(i);
它为5个元素保留了空间,这些元素按顺序插入(这通常在您事先知道有多少个元素时使用,但每个元素不需要知道要插入的索引-每个元素只需添加到向量的末尾


请注意,在任何一种情况下,您都可以添加额外的项-向量只会调整大小。为了保持代码的最佳状态,目的是尝试将向量调整大小的次数保持在最小值。

您的意思肯定是
resize()
而不是
reserve()
std::vector v(5)
执行自动调整大小(5);,对吗?除了向后推之外,还有其他方法添加元素吗?是的,构造函数版本在开始时调整
向量的大小。有多种方法可以将项添加到
向量
-您在原始帖子中包含了其中两种方法-
[]< /代码>运算符将让您重新分配一个元素在<代码> vector <代码> >“代码> INSERT < /CER>让您在中间添加一个新的项,并且<代码> PuxSuffe让您在末尾添加一个。其他容器,如<代码> DeQue/代码>也有<代码> PursProf 谢谢,有没有办法将元素添加到一个向量中?我使用了代码>保留(n)
而不是push\u back,因为push\u back很慢。在保留空间后push\u back会加速吗?有多慢?@SkyRipper:如果你使用
reserve()
设置了足够的
容量()
那么
push\u back()
只在保留空间中构造新的元素(不重新分配整个向量)。
std::vector<int> v;
v.reserve(5);

for(int i = 0; i < 5; i++)
    v[i] = i;

std::vector<int>::iterator it = v.begin()+1;
it = v.insert(it, 33);

cout << v[0] << " " << v[1] << " " << v[2] << " " << v[3] << " " << v[4] << endl;
//outs: 33 1 2 3 4
std::vector<int> v(5);
std::vector<int> v;
v.reserve(5);
std::vector<int> v;
v.resize(5);

for(int i = 0; i < 5; i++)
    v[i] = i;
std::vector<int> v;
v.reserve(5);

for(int i = 0; i < 5; i++)
    v.push_back(i);