防止 std::vector 在 push_back 时重新分配空间

4

我有一个std::vector,我知道它永远不需要扩展 - 它将始终具有n个元素(不幸的是,n在编译时未知,因此我无法使用std :: array)。 我可以这样做:

std::vector<blah> v(n);

设置n的容量是正确的。但是,当我使用push_back填充v时,它会自动调整大小为2n

我知道这是过早的优化,但这让我感到困扰。有没有一种方法可以设置最大大小或其他东西?

2个回答

14

该构造函数并不设置向量的容量为n,而是创建一个包含n个由blah的默认构造函数构造的对象的向量。对于具有Java或.NET背景的人来说,这可能会令人困惑,因为ArrayListList<T>都有一个可以设置初始容量的构造函数。

解决方法是分两步进行:

std::vector<blah> v; // create an empty vector
v.reserve(n); // increase capacity

3
就此而言,如果有人误用向量并导致容量增加一倍,这并不能防止容量增长。如果您想要这种安全性,可能需要自己创建一个类。 - Platinum Azure

0
在你的特定情况下,你需要的是一个`unique_ptr`。标准的智能指针对原生数组有支持。
此外,在接受的答案中还要注意,如果你使用`std::vector`,只有在显式调用`reserve`时才能保证不重新分配大小。
引用如下:
“在调用reserve()之后,直到插入使得向量的大小大于最近一次调用reserve()中指定的大小之前,插入操作不会发生重新分配。”
因此,以下代码片段不符合标准:
// UB
if (v.size() != v.capacity()) {
  // assume no resize
  v.push_back(something);
}

实际上,我认为大多数实现只有在达到容量限制时才进行调整大小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接