【问题标题】:Resizing an "std::vector"; which elements are affected?调整“std::vector”的大小;哪些元素受到影响?
【发布时间】:2016-12-15 18:41:10
【问题描述】:
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(收缩):是否保证0th1st2nd元素受到保护(即;它们的值不会改变)在使用以下代码调整此向量的大小后:vect.resize(3)?

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

【问题讨论】:

  • 注意:Object0-4 被复制到向量中。因此向量中的值与原始值不同。

标签: c++ vector resize


【解决方案1】:

问题 1:是的,标准说:

void resize(size_type sz);

如果sz &lt; size(),则等价于erase(begin() + sz, end());

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

【讨论】:

    【解决方案2】:

    问题一:

    是的,来自cplusplus.com“如果 sz 小于当前向量大小,则内容将减少到它的第一个 sz 元素,其余的被丢弃。”

    问题 2:

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

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

    【讨论】:

    • 如果AClass 的默认构造函数是私有的,并且它所有可用的构造函数都需要至少一个参数怎么办?
    【解决方案3】:

    vector 总是在最后增长和缩小,所以如果你减小 vector 的大小,只会删除最后的元素。如果您通过调整大小来增长向量,则使用默认构造的对象作为新条目的值将新元素添加到末尾。对于一个类,这是使用默认构造函数创建的新对象的值。对于原语,这是零(或布尔为假)。

    是的,未删除的元素在调整大小期间始终受到保护。

    【讨论】:

      【解决方案4】:

      是的,当你缩小一个向量时,所有剩下的对象都会保留它们之前的值。

      当你扩展一个向量时,你提供一个参数来指定一个用于填充新槽的值。该参数默认为T()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        • 2017-12-18
        • 2020-10-11
        • 1970-01-01
        • 2019-11-21
        • 2020-12-09
        相关资源
        最近更新 更多