C++ 向量初始容量

Posted

技术标签:

【中文标题】C++ 向量初始容量【英文标题】:C++ Vector initial capacity 【发布时间】:2014-05-01 18:43:54 【问题描述】:

我有一些代码使用了数千个向量,每个向量只有 4 个条目,所以我想将每个向量的初始大小设置为 4,这样我就可以通过不保留未使用的内存来优化内存使用。

我试过保留方法:

vector<Foo> bar;
bar.reserve(10);

但它似乎扩展而不收缩,似乎也没有构造函数可以创建具有指定容量的向量。

还有 2 个额外问题:

默认初始容量是多少

我可以创建一个具有特定容量的向量吗?

【问题讨论】:

如果要设为4,为什么不设为4? 如果要缩小,请使用shrink_to_fit() 只有我一个人不明白vector&lt;Foo&gt; bar; bar.reserve(4); 有什么问题吗? @mmohab:如果这就是您所需要的,那么您的问题肯定不会用措辞来表明它。如果你想缩小向量的容量,你为什么要说初始化它? 想一想,如果考虑到向量的初始容量默认大于 4 的可能性,这个问题会很有意义。所以我只想说,虽然不能保证,但标准库的所有知名实现都使用0作为初始容量,你可以安全地使用vector&lt;Foo&gt; bar; bar.reserve(4); 【参考方案1】:

构造函数无法控制向量的容量 - 没有适用的重载。

C++ 标准不保证默认构造向量vector&lt;Foo&gt; bar; 的容量。然而,所有众所周知的实现都使用 0 作为默认容量。这是您可以依赖的东西,因为此时分配内存是没有意义的。

所以我相信你的问题的答案是:只需使用

vector<Foo> bar;
bar.reserve(4);

【讨论】:

【参考方案2】:

每个向量只有 4 个条目

那么你最好改用std::array&lt;Foo, 4&gt;

如果你需要 4 个元素,因为你想要一个 mathematical 向量,我建议使用结构:

struct Vector

    Foo x, y, z, w;
;

【讨论】:

换句话说,你需要一个 C++11 编译器。如果没有 GCC 4.9,请使用它。 实际上这不是我需要的,例如矢量大小可能会更改为其他值 5,但所有列表的大小都相同 那你为什么说每个都有四个条目呢?现在你是说它们从零开始,可以超过四? @mmohab:你知道编译时这个长度吗?

以上是关于C++ 向量初始容量的主要内容,如果未能解决你的问题,请参考以下文章

为啥在达到容量后在向量中进行插入时,C++ 不处理迭代器?

C++ priority_queue 底层向量容器容量调整大小

使用 Enumerable.Repeat 进行容量列表初始化的问题 [重复]

C++初始化模板类

`resize` 是不是有降低向量容量的风险?

Java 之 Vector 集合