当向量的维度必须增加时,避免重新分配向量

2023-12-05

I have a

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

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

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

我提前知道从另一个容器获得的大小(不是编译时)。问题是我必须将向量的维度减少 1 个元素。事实上,这种情况不是问题,因为调整大小比初始尺寸更小,不进行重新分配。我可以做

样本.调整大小(999999);

问题是,在某些情况下,我必须增加一个元素的维度,而不是减少 1 个元素的维度。如果我做

samples.resize(1000001);

为了提高效率,我希望避免重新分配的风险。 我问是否可以像这样解决我的问题:

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::vector 保证连续内存的假设,并且如果data指针没有改变,就没有发生重新分配。这也很明显,由capacity()结果保留10001每次致电后resize().

参考参数关于向量:

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

参考参数 on reserve:

正确使用reserve()可以防止不必要的重新分配,但不恰当地使用reserve()(例如,在每次push_back()调用之前调用它)实际上可能会增加重新分配的次数(通过导致容量线性而不是指数增长)并且导致计算复杂度增加和性能下降。

参考参数还指出resize:

复杂

当前大小和计数之间的差异呈线性。如果容量小于计数,则由于重新分配可能会导致额外的复杂性

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当向量的维度必须增加时,避免重新分配向量 的相关文章

随机推荐