我有一段代码创建了一个std :: vector< T>已知大小:
std::vector<T> vectorOfTs(n);
调用push_back会将大小增加到n + 1吗?
vectorOfTs.push_back(T());
答案 0 :(得分:19)
是;请注意vector<T>.capacity()
与vector<T>.size()
不同。后者表示当前在向量中的元素数,而前者表示适合当前为向量的内部缓冲区分配的空间的项数。
答案 1 :(得分:9)
几乎。如果没有例外,则size()
将递增。
push_back(T())
也可以在各个阶段抛出异常:请参阅here或简要说明:
T()
构建,在这种情况下,不会调用push_back
,size()
不受影响
如果vector
需要增加容量,可能会抛出,在这种情况下size()
不受影响
vector
元素将使用std::allocator_traits<A>::construct(m, p, v);
进行复制或移动,如果A
为std::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。