防止 std::vector 在 push_back 上调整大小

问题描述 投票:0回答:2

我有一个 std::vector,我知道它永远不会增长——它总是有

n
元素(不幸的是,
n
在编译时未知,所以我不能使用 std::array) 。我能做到:

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

这正确地将其容量设置为

n
。但是当我继续用
v
填充
push_back
时,它会自动调整大小为
2n

我意识到这是不成熟的优化,但它困扰着我。有没有办法设置最大尺寸或其他什么?

c++ stl
2个回答
14
投票

该构造函数不会将向量的容量设置为

n
,而是创建一个包含使用
n
的默认构造函数构造的
blah
对象的向量。对于具有 Java 或 .NET 背景的人来说,这可能会令人困惑,其中
ArrayList
List<T>
都有一个设置初始容量的构造函数。

解决方案是分两步完成:

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

0
投票

在您的具体情况下,您想要的是

unique_ptr<int[]>
。标准智能指针支持本机数组。

此外,作为已接受答案的补充,请注意,如果您使用

std::vector
,则只有在明确调用
reserve
时才能保证不调整大小。

保证在调用reserve()之后发生的插入期间不会发生重新分配,直到插入使向量的大小大于最近调用reserve()中指定的大小。

因此,以下代码片段不符合标准:

// UB
if (v.size() != v.capacity()) {
  // assume no resize
  v.push_back(something);
}

实际上,我认为大多数实现仅在达到容量时才调整大小。

© www.soinside.com 2019 - 2024. All rights reserved.