【问题标题】:How to ensure a std::vector will not be re-allocated? [duplicate]如何确保不会重新分配 std::vector? [复制]
【发布时间】:2020-10-07 14:58:34
【问题描述】:

我知道在向量上使用 push_back() 时,可能会重新分配该向量(如果没有剩余空间)以拥有更多空间。 使用 pop_back() 时,是否可以重新分配向量,以释放未使用的空间?

一般来说,当使用一系列 push_back() 和 pop_back() 操作时,我能否以某种方式确保我的向量不会被重新分配(假设我知道它的最大容量)?这种重新分配使我的指针和迭代器无效并导致问题。

【问题讨论】:

    标签: c++ memory vector push-back


    【解决方案1】:

    当使用pop_back()时,是否可以重新分配vector,以便 释放未使用的空间?

    pop_back 不会重新分配。你必须显式调用shrink_to_fit

    一般来说,我能否以某种方式确保我的向量不会被重新分配 (假设我知道它的最大容量),当使用一系列 push_back() 和 pop_back() 操作?

    在推送或弹出任何内容之前,您应该以最大容量调用reserve


    以下内容更基于意见:

    这种重新分配使我的指针和迭代器无效,并导致 问题。

    这对我来说是一种代码味道。

    • 拥有一堆指针/迭代器会导致代码难以理解和维护(这个确切的场景就是一个很好的例子)
    • 即使您通过reserveing“修复”此问题,您现在也是在建立一个未来可能会改变的假设
    • 如果您需要这些迭代器稳定性保证,vector 一开始可能不是正确的结构

    【讨论】:

    • 也许您至少可以在您自己的类中快速修复封装/增强向量,例如检查 push_back() 是否会溢出保留容量或检查第一个元素的内存位置是否改变
    【解决方案2】:

    引用cppreference:

    迭代器和对最后一个元素的引用以及 end() 迭代器都无效。

    因此不会发生重新分配,因为通过推断,所有其他迭代器仍然有效。因此,如果您reserve 预先需要的最大空间量,那么您应该能够获得您想要的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 2018-01-23
      • 2017-10-15
      • 2018-04-01
      • 1970-01-01
      相关资源
      最近更新 更多