gpt4 book ai didi

c++ - 如何使用 STL (C++) 避免重新分配

转载 作者:太空狗 更新时间:2023-10-29 20:48:54 25 4
gpt4 key购买 nike

本题来源于题目:

vector reserve c++

我正在使用 vector<vector<vector<double> > > 类型的数据结构.在添加项 (double s) 之前,不可能知道每个 vector (外部 vector 除外)的大小。我可以获得每个“维度”中项目数量的近似大小(上限)。

使用共享指针的解决方案可能是可行的方法,但我想尝试一个解决方案,其中 vector<vector<vector<double> > >只有.reserve()编辑了足够的空间(或以其他方式分配了足够的内存)。

威尔A.reserve(500) (假设 500 是大小,或者大小的上限)足以容纳大尺寸的“2D” vector ,比如 [1000][10000]?

我提出这个问题的原因主要是因为我看不到任何合理估计A内部大小的方法。在 .reserve(500) 的时候.

我的问题的一个例子:

vector<vector<vector<int> > > A;
A.reserve(500+1);
vector<vector<int> > temp2;
vector<int> temp1 (666,666);
for(int i=0;i<500;i++)
{
A.push_back(temp2);
for(int j=0; j< 10000;j++)
{
A.back().push_back(temp1);
}
}

这会确保不会为 A 进行重新分配吗?

如果temp2.reserve(100000)temp1.reserve(1000)在创建时添加了这是否可以确保根本不会发生重新分配?

在上面请忽略由于保守 .reserve() 内存可能被浪费的事实电话。

提前谢谢大家!

最佳答案

您的示例将导致大量复制和分配。

vector<vector<vector<double>>>  A;
A.reserve(500+1);
vector<vector<double>> temp2;
vector<double> temp1 (666,666);
for(int i=0;i<500;i++)
{
A.push_back(temp2);
for(int j=0; j< 10000;j++)
{
A.back().push_back(temp1);
}
}

问:这样能保证A不会重新分配吗?
答:是的。

问:如果在创建时添加 temp2.​​reserve(100000) 和 temp1.reserve(1000) 是否可以确保根本不会发生重新分配?
A: 这里的 temp1 已经知道它自己的创建时间长度并且不会被修改,所以添加 temp1.reserve(1000) 只会强制进行不必要的重新分配。
我不知道 vector 类在其复制构造函数中复制了什么,使用 A.back().reserve(10000) 应该适用于此示例。
更新:刚刚用g++测试,temp2的容量不会被复制。所以 temp2.​​reserve(10000) 将不起作用。

并且请在发布代码时使用源格式,使其更具可读性:-)。

关于c++ - 如何使用 STL (C++) 避免重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2351516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com