我有一个 std::vector,我知道它永远不会增长——它总是有
n
元素(不幸的是,n
在编译时未知,所以我不能使用 std::array) 。我能做到:
std::vector<blah> v(n);
这正确地将其容量设置为
n
。但是当我继续用 v
填充 push_back
时,它会自动调整大小为 2n
。
我意识到这是不成熟的优化,但它困扰着我。有没有办法设置最大尺寸或其他什么?
该构造函数不会将向量的容量设置为
n
,而是创建一个包含使用 n
的默认构造函数构造的 blah
对象的向量。对于具有 Java 或 .NET 背景的人来说,这可能会令人困惑,其中 ArrayList
和 List<T>
都有一个设置初始容量的构造函数。
解决方案是分两步完成:
std::vector<blah> v; // create an empty vector
v.reserve(n); // increase capacity
在您的具体情况下,您想要的是
unique_ptr<int[]>
。标准智能指针支持本机数组。
此外,作为已接受答案的补充,请注意,如果您使用
std::vector
,则只有在明确调用 reserve
时才能保证不调整大小。
保证在调用reserve()之后发生的插入期间不会发生重新分配,直到插入使向量的大小大于最近调用reserve()中指定的大小。
因此,以下代码片段不符合标准:
// UB
if (v.size() != v.capacity()) {
// assume no resize
v.push_back(something);
}
实际上,我认为大多数实现仅在达到容量时才调整大小。