调整“std :: vector”的大小;哪些元素受到影响?

时间:2011-01-27 19:39:33

标签: c++ vector resize

std::vector<AClass> vect;
AClass Object0, Object1, Object2, Object3, Object4;
vect.push_back(Object0);    // 0th
vect.push_back(Object1);    // 1st
vect.push_back(Object2);    // 2nd
vect.push_back(Object3);    // 3rd
vect.push_back(Object4);    // 4th

问题1(缩小):是否保证 0th 1st 2nd 元素受到保护(即;它们的值不会改变)在使用以下代码调整此向量的大小后:vect.resize(3)

问题2(扩展):按代码vect.resize(7)展开此向量后; a。前5个元素( 0th 4th )是否保持不变?
b。新添加的两个元素( 5th 6th )会发生什么?它们的默认值是什么?

4 个答案:

答案 0 :(得分:12)

问题1:是的,标准说:

void resize(size_type sz);
     

如果sz < size(),相当于erase(begin() + sz, end());

问题2:如果不需要调整大小,是的。否则,您的元素将被复制到内存中的其他位置。它们的值将保持不变,但这些值将存储在其他位置。所有迭代器,指针和对这些对象的引用都将失效。默认值为AClass()

答案 1 :(得分:1)

问题1:

是的,来自cplusplus.com“如果sz小于当前矢量大小,则内容将减少为其第一个sz元素,其余内容将被删除。”

问题2:

a)第一个元素保持不变,向量只增加了它内部缓冲区的大小,以添加新元素。

b)调用AClass的默认构造函数来插入每个新元素。

答案 2 :(得分:1)

向量总是在最后增长和缩小,因此如果减小向量的大小,则只删除最后的元素。如果使用resize生成向量,则使用默认构造的对象作为新条目的值将新元素添加到末尾。对于类,这是使用默认构造函数创建的新对象的值。对于原语,这是零(或bool为假)。

是的,在调整大小期间,总是会保护未删除的元素。

答案 3 :(得分:1)

是的,缩小向量时,所有剩余的对象都保留其先前的值。

展开矢量时,提供一个参数,指定将用于填充新插槽的值。该参数默认为T()