空向量的容量是多少?

Posted

技术标签:

【中文标题】空向量的容量是多少?【英文标题】:what is the capacity of an empty vector? 【发布时间】:2009-11-24 05:21:26 【问题描述】:

看起来像一个愚蠢的问题。但是对我的answer 对其中一个 SO 问题的评论让我重新思考。

[评论说,空向量的容量不必为零]

默认情况下,我的答案是 0,因为向量中没有元素。将容量保持为 0 是有意义的,并且在第一次分配时可以增加它而不会影响性能。

但标准并没有说什么。 (我也检查了 Josuttis 的书)。

它纯粹是实现特定的吗?是否有任何 STL 供应商使用任意数字作为空向量的容量?

任何想法...

【问题讨论】:

【参考方案1】:

C++ 标准 23.2.4.2 只说 vector::capacity

向量可以容纳而不需要重新分配的元素总数。

这意味着实际值完全是特定于实现的。

【讨论】:

【参考方案2】:

容量可以是实施者认为正确或必要的任何内容。

还应该注意的是,假设您知道当前的capacity() 而无需调用该函数,这绝不是“安全的”。如果您保留 10 个元素,则实现者可以随意分配 100 个元素。或 11、42(首选)或仅 10。

【讨论】:

确实如此。 GNU STL 从容量 0 开始。Java API 规范说它从容量 10 开始。这确实是一个实现细节。【参考方案3】:

为了快速浏览 Google 并在一些随机论坛(通常是未知的血统,所以,是的)上弹跳,它似乎是特定于实现的。

这几乎不是问题,因为您可以通过调用 reserve 立即更改它。

【讨论】:

【参考方案4】:

如果确定要存储什么数据向量并且是特定于实现的,则可以通过对向量使用 resize() API 来更改向量的容量。

【讨论】:

> 可以使用 resize() 改变向量的容量,不,这也改变了大小。保留更改容量而不影响大小。 是的,fred 你是对的,保留只改变容量而不影响向量的大小。道歉。 更准确地说,可以通过调用reserve() 或resize() 来调整vector 的容量。这些成员函数在两个方面有所不同。与分配内存并使用默认值初始化的 resize() 不同,reserve() 仅分配原始内存而不进行初始化。此外,reserve() 不会改变向量的大小;它只会改变向量的容量。

以上是关于空向量的容量是多少?的主要内容,如果未能解决你的问题,请参考以下文章

Java 之 Vector 集合

创建自定义 Vector 类错误

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

当我将向量插入无序地图时,向量的容量为 0

减少 stl 向量的容量

java集合之Vector向量基础