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

Posted

技术标签:

【中文标题】`resize` 是不是有降低向量容量的风险?【英文标题】:Will `resize` have any risk to reduce the vector capacity?`resize` 是否有降低向量容量的风险? 【发布时间】:2018-03-10 23:03:03 【问题描述】:

在 C++ 中,resizestd::vector)方法改变了向量的大小(必要时构造/销毁对象),reserve 允许最终增加向量的容量。 shrink_to_fit 将减少向量的容量以匹配其大小。增加向量大小时(通过resizepush_backinsert),如果需要,容量会增加(如果我没记错的话,每次需要增加时都会增加一倍)。

标准是否确保向量永远不会减少其容量,除非函数shrink_to_fit 被调用?或者向量容量是否可能会根据编译器认为明智的做法而有所不同?

【问题讨论】:

我认为文档确实用Vector capacity is never reduced when resizing to smaller size 回答了这个问题。我只阅读了cplusplus docs,然后才询问哪些没有提及。谢谢 【参考方案1】:

不,向量的容量不会减少reserveresize

std::vector::reserve:

如果new_cap [不大于capacity] ...没有迭代器或引用无效。

std::vector::resize

当调整到更小的尺寸时,向量容量永远不会减少,因为这会使所有迭代器失效,而不仅仅是那些会被等效的 pop_back() 调用序列失效的迭代器。

Relevant part of the standard

【讨论】:

谢谢。我认为 cppreference.com 往往比 cplusplus.com 更好,应该总是看看他们的。我会在 6 分钟内准确地接受你的回答 :) @Remi.b 是的,cppreference 至少会稍微好一些。我实际上已将 cplusplus.com 列入黑名单,因此它不会出现在我的谷歌搜索中......

以上是关于`resize` 是不是有降低向量容量的风险?的主要内容,如果未能解决你的问题,请参考以下文章

容量是不是复制到向量中?

C++ 向量初始容量

扩展作为内存传递的向量的大小

空向量的容量是多少?

eigen中重置矩阵大小 resize函数怎么用

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