【问题标题】:Does push_back() always increase a vector's size?push_back() 是否总是增加向量的大小?
【发布时间】:2010-11-11 09:56:03
【问题描述】:

我有一段代码可以创建一个已知大小的 std::vector

std::vector<T> vectorOfTs(n);

调用 push_back 是否会将大小增加到 n+1?

vectorOfTs.push_back(T());

【问题讨论】:

  • 您将内存分配作为标签包含在内;您能否详细说明您的期望以及在这方面让您感到困惑的是什么?

标签: c++ vector memory-management push-back


【解决方案1】:

是的;请注意,vector&lt;T&gt;.capacity()vector&lt;T&gt;.size() 不同。后者表示当前在向量中的元素数,而前者表示适合当前为向量内部缓冲区分配的空间中的项目数。

【讨论】:

    【解决方案2】:

    几乎。如果没有异常,则size() 将递增。

    push_back(T()) 也可以在不同阶段抛出异常:参见here,或总结:

    • T() 构造,在这种情况下,不会调用 push_backsize() 不受影响

    • 如果vector需要增加容量,可能会抛出,此时size()不受影响

    • vector 元素将使用std::allocator_traits&lt;A&gt;::construct(m, p, v); 复制或移动构造,如果Astd::allocator&lt;T&gt;,那么这将调用placement-new,如::new((void*)p) T(v):如果其中任何一个抛出vectorsize() 不受影响,****除非***

      • move 构造函数不是 noexcept 并且会抛出:在这种情况下效果未指定
    • 然后向量更新完成 - size() 将增加并且值将在 vector 中(即使 T::~T() 也是如此)

    【讨论】:

      【解决方案3】:

      是的。如果您想保留空间,请调用reserve(),例如:

      std::vector<T> vectorOfTs;
      vectorOfTs.reserve(n);
      // now size() == 0, capacity() >= n
      
      vectorOfTs.push_back(T());
      // now size() == 1
      

      【讨论】:

      • 你的回答似乎有点模棱两可,充其量。 reserve不会改变大小,它只是保留内存(因此可能会改变capacity)。
      • 嗯,真的吗?我将此作为一个不同的选项提出,如果 OP 的意图是为大小为 n 的向量预分配内存而不是具有 n 个默认构造 Ts 的向量,他可以使用reserve(),但主要答案是“是"。
      • 你已经完成了 99% 的工作;我试图编辑和删除 GMan 提到的歧义。 (最初的问题在分配方面的预期和混淆方面含糊不清。)
      【解决方案4】:

      是的。

      std::vector<T> vectorOfTs(n);
      

      在上面的语句中,实际上您正在构造“n”个类型 T 的新实例(即每次都会触发默认构造函数 T())。现在向量 vectorOfTs 包含 n 个元素。将为上述语句调用以下版本的向量构造函数。

      explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
      

      因此,当您将另一个元素推回向量中时,向量的大小将为 n+1。

      【讨论】:

        猜你喜欢
        • 2011-12-08
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 2022-07-06
        • 2014-02-20
        • 2014-05-30
        • 2020-04-28
        • 2013-09-18
        相关资源
        最近更新 更多