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 )会发生什么?它们的默认值是什么?
答案 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()
。