繁体   English   中英

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

[英]Does push_back() always increase a vector's size?

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

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

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

vectorOfTs.push_back(T());

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

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

push_back(T())也可以在各个阶段抛出异常:请参阅此处或概括:

  • T()构造,在这种情况下不会发生对push_back调用,并且size()不受影响

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

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

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

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

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

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

是。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM