C++中std::resize(n)和std::shrink_to_fit之间的区别

Difference between std::resize(n) and std::shrink_to_fit in C++?

本文关键字:std to fit 区别 shrink 之间 resize C++      更新时间:2023-10-16

我发现了以下语句:

resize(n)–调整容器的大小,使其包含"n"个元素
shrink_to_fit()–减少容器的容量以适应其大小,并销毁超出容量的所有元素。

这些功能之间有什么显著的区别吗?它们属于c++中的矢量

矢量有两个"长度"属性,表示不同的东西:

  • size是向量中可用元素的数量。它是你存储的东西的数量。这是一个概念长度
  • capacity是向量当前分配的内存量中适合多少元素

capacity >= size必须始终为真,但没有理由使它们始终相等。例如,当您删除一个元素时,缩小分配将需要创建一个小一个bucket的新分配,并将剩余内容移到上面("allocate,move,free"(。

类似地,如果capacity == size和您添加一个元素,向量可以将分配增加一个元素(另一个"分配、移动、释放"操作(,但通常您要添加多个元素。如果容量需要增加,向量的容量将增加,而不是一个元素,这样您就可以在需要再次移动所有元素之前再添加几个元素。

有了这些知识,我们可以回答您的问题:

  • std::vector<T>::resize()更改数组的大小。如果将其大小调整为小于当前大小,则多余的对象将被销毁。如果将其大小调整为大于当前大小,则在末尾添加的"新"对象将默认初始化
  • std::vector<T>::shrink_to_fit()要求更改容量以匹配当前大小。(实现可能,也可能不接受此请求。它们可能会降低容量,但不会使其等于大小。它们可能根本不做任何事情。(如果请求得到满足,这将丢弃矢量分配中未使用的部分或全部。当你构建完一个向量,并且永远不会向其中添加另一个项目时,你通常会使用这个方法。(如果你提前知道要添加多少个项目,那么在添加任何项目之前,最好使用std::vector<T>::reserve()来告诉向量,而不是依赖shrink_to_fit来做任何事情。(

所以您使用resize()来改变向量中概念上有多少东西

您可以使用shrink_to_fit()来最小化向量内部分配的多余空间,而不必在概念上改变向量中的内容数量。

shrink_to_fit()–减少容器的容量以适应其大小,并销毁超出容量的所有元素。

这是对所发生事情的错误描述。从本质上讲,销毁所有超出容量的元素部分并不准确。

在C++中,当动态内存用于对象时,有两个步骤:

  1. 内存是为对象分配的
  2. 对象在内存位置进行初始化/构造

当动态分配内存中的对象被删除时,还有两个步骤,它们反映了构建的步骤,但顺序相反:

  1. 内存位置的对象被破坏(对于内置类型,这是一个noop(
  2. 对象使用的内存被释放

超过容器的大小分配的内存只是缓冲区。它们没有保存任何正确初始化的对象。这只是原始记忆。shrink_to_fit()确保没有额外的内存,但在这些位置没有对象。因此,没有任何东西被破坏,只有内存被释放。

根据与shrink_to_fit相关的C++标准

效果:shrink_to_fit是一个减少容量的非绑定请求((到size((。

并且相对于resize

效果:如果sz<size((,从序列否则,将sz-size((默认插入的元素附加到序列。

很明显,函数做的事情不同。此外,第一函数没有参数,而第二函数甚至有两个参数。函数shrink_to_fit不会改变容器的大小,但可以重新分配内存。