4

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

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

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

vectorOfTs.push_back(T());
4

4 回答 4

19

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

于 2010-11-11T09:57:58.627 回答
10

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

push_back(T())也可以在各个阶段抛出异常:请参见此处,或总结:

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

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

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

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

于 2010-11-11T10:19:13.487 回答
4

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

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

vectorOfTs.push_back(T());
// now size() == 1
于 2010-11-11T09:59:40.460 回答
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。

于 2010-11-11T10:46:23.007 回答