当必须将其尺寸增加时,请避免重新分配其尺寸
Avoid the reallocation of a vector when its dimension has to be incremented
我有
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((调用的等效序列无效的矢量功能。
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为模板参数类型中的新对象分配内存
- 新运算符分配的大小大于声明的大小.为什么
- 在C++中分配分配
- 为什么支撑初始化分配分配填充垃圾变量
- C 新操作员分配新内存
- 新不分配内存?
- 如果我的C++“新”内存分配失败,如何找出返回值
- 我可以用新的分配内存块吗?
- COM / DCOM:服务器存根不会为现有接口中的新方法分配内存
- 在线程在 C++ 中完成后将新任务分配给线程
- 只能使用CUDA中的新运算符分配有限的内存
- 与将新内容分配给向量的指针斗争
- 确定C++中新运算符分配的内存大小
- 按新内存分配
- 是否有必要使用 'new' 将新指针分配给与指向同一结构的先前存在的指针相同的结构?如果是这样,为什么?
- 用于新运算符分配的公共内存
- boost::io_service post方法是否引起新的分配?
- 如何在C++中检索由新运算符分配的对象的地址