当必须将其尺寸增加时,请避免重新分配其尺寸

Avoid the reallocation of a vector when its dimension has to be incremented

本文关键字:新分配 分配 增加      更新时间:2023-10-16

我有

vector< pair<vector<double> , int>> samples;

该向量将包含许多元素。为了效率,我以这种方式将其初始化:

vector< pair<vector<double> , int>> samples(1000000);

我知道我从另一个容器中获得的大小(不是编译时间(。问题在于,我必须降低1个元素,即向量的尺寸。实际上,这种情况不是问题,因为调整大小的尺寸比最初的no beal no reallocation。我可以做

样品resize(999999(;

问题在于,在某些情况下,我不必降低1个元素的尺寸,我必须增加元素的尺寸。如果我做

samples.resize(1000001);

我想避免效率rasons进行重新分配的风险。我问是否可能解决我的问题:

vector< pair<vector<double> , int> samples;
samples.reserve(1000001);
samples.resize(1000000);
.
. Elaboration that fill samples 
.
samples.resize(1000001); //here I don't want reallocation

还是有更好的解决方案?预先感谢!

(我正在使用C 11编译器(

刚刚编写了一个示例程序来证明,如果向量的容量足够,则resize不会重新分配空间:

#include <iostream>
#include <vector>
#include <utility>
#include <cassert>
using namespace std;
int main() 
{
  vector<pair<vector<double>, int>> samples;
  samples.reserve(10001);
  auto data = samples.data();
  assert(10001==samples.capacity());
  samples.resize(10000);
  assert(10001 == samples.capacity());
  assert(data == samples.data());
  samples.resize(10001); //here I don't want reallocation
  assert(10001==samples.capacity());
  assert(data == samples.data());  
}

该演示是基于std ::向量保证连续内存的假设,如果data指针不更改,则没有发生任何realloc。这也很明显,每次致电resize()后,capacity()结果保留10001

向量上的cppreference:

自动处理矢量的存储,根据需要进行扩展和收缩。向量通常比静态阵列占用更多的空间,因为分配了更多的内存来处理未来的增长。这样,向量就不需要每次插入元素时重新分配,而只有当额外的内存耗尽时。可以使用容量((函数查询分配的内存的总量。

reserve上的cppreference:

正确使用Reserve((可以防止不必要的重新分配,但是Reserve((的不适当用途(例如,在每个push_back((调用(之前将其调用实际上可能会增加重新位置的数量(通过导致线性增长而不是线性增长的能力呈指数(,并导致计算复杂性提高和性能下降。

cppReference也对resize

复杂性

线性在当前大小和计数之间的差异。如果容量小于计数

,则可能导致额外的复杂性

我询问是否可能解决我的问题:

samples.reserve(1000001);
samples.resize(1000000);

是的,这是解决方案。

或者如果有更好的解决方案?

不是我知道的。

我记得调整大小小于容量时,将不会有重新分配。因此,您的代码将无需重新分配而工作。

cppreference.com
调整大小时,矢量容量永远不会降低,因为这会使所有迭代器无效,而不仅仅是被Pop_back((调用的等效序列无效的矢量功能。