push_back()总是会增加向量的大小吗?

时间:2010-11-11 09:56:03

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

我有一段代码创建了一个std :: vector< T>已知大小:

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

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

vectorOfTs.push_back(T());

4 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:9)

几乎。如果没有例外,则size()将递增。

push_back(T())也可以在各个阶段抛出异常:请参阅here或简要说明:

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

  • 如果vector需要增加容量,可能会抛出,在这种情况下size()不受影响

  • vector元素将使用std::allocator_traits<A>::construct(m, p, v);进行复制或移动,如果Astd::allocator<T>,则会调用展示位置 - new ,如::new((void*)p) T(v)所述:如果其中任何一个引发vector的{​​{1}}未受影响,****除非***

    • 移动构造函数不是size()并且抛出:在这种情况下效果未指定
  • 向量更新然后完成 - noexcept将增加,值将在size()(即使vector

答案 2 :(得分:4)

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

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

vectorOfTs.push_back(T());
// now size() == 1

答案 3 :(得分:0)

是。

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

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

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

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