C++ 媒介储备c++;

C++ 媒介储备c++;,c++,vector,C++,Vector,我有一个非常大的多维向量,它的大小一直在变化。 当我只知道尺寸的良好近似值时,使用vector.reserve()函数有什么意义吗 基本上我有一个向量 A[256*256][x][y] 其中,对于程序中的每个迭代,x从0到50,然后再次返回到0。y值每次都可能不同,这意味着对于每个 [256*256][y]元素向量y可以具有不同的大小,但仍然小于256 因此,为了澄清我的问题,我有: vector<vector<vector<int>>> A; for(int

我有一个非常大的多维向量,它的大小一直在变化。 当我只知道尺寸的良好近似值时,使用vector.reserve()函数有什么意义吗

基本上我有一个向量

A[256*256][x][y]

其中,对于程序中的每个迭代,x从0到50,然后再次返回到0。y值每次都可能不同,这意味着对于每个
[256*256][y]
元素向量y可以具有不同的大小,但仍然小于256

因此,为了澄清我的问题,我有:

vector<vector<vector<int>>> A;
for(int i =0;i<256*256;i++){
  A.push_back(vector<vector<int>>());
  A[i].push_back(vector<int>());
  A[i][0].push_back(SOME_VALUE);
}
在这之后,我从顶部再次做同样的事情

何时以及如何为向量保留空间。 如果我理解正确,我会节省很多时间,如果我会使用保留,因为我改变大小的所有时间

在某些情况下,保留向量所能具有的最大大小(即
[256*256][50][256]
)的正负两面是什么

顺便说一句,我知道不同的矩阵模板和Boost,但决定在这一个向量

编辑: 我还想知道如何在多维数组中使用reserve函数。
如果我只在二维中保留向量,那么如果我在第三维中超过了它的容量,它会复制整个向量吗?

您有一个工作实现,但担心性能。如果你的分析显示它是一个瓶颈,你可以考虑使用一个裸体的C风格的整数数组,而不是向量向量。 请参阅以获取示例

您每次都可以重复使用相同的分配,
realloc
ing(视需要而定),并最终将其保持在使用的高峰期


如果向量确实是瓶颈,那么除了避免对每个循环迭代的向量进行大小调整操作之外,性能很可能会由您对阵列的访问模式决定。尝试按顺序访问最高顺序。

每当将一个向量推入另一个向量时,请在push vectors构造函数中设置大小:

 A.push_back(vector<vector<int>>( somesize ));
A.push_back(向量(某种大小));

如果您在构建时知道向量的大小,请将该大小传递给c'tor,并使用
运算符[]
而不是
推回
。如果您不能完全确定最终大小,请猜测(可能再添加一点)并使用
reserve
预先为向量保留足够的内存

保留向量可以具有的最大大小(在某些情况下为[256*256][50][256])的正负两面是什么

负面影响:潜在的内存浪费。积极的一面:更少的CPU时间,更少的堆碎片。这是内存/cpu的折衷,最佳选择取决于您的应用程序。如果你不是内存绑定(大多数消费机器都有足够的RAM),考虑预留。


< >决定要保留多少内存,查看平均内存消耗,而不是在峰值(保留256×256×50×256不是一个好主意,除非经常需要这些维度)

< P>帮助您讨论以下类型DEFS:

typedef std::vector<int> int_t;   // internal vector
typedef std::vector<int_t> mid_t; // intermediate
typedef std::vector<mid_t> ext_t; // external
您应该考虑的另一件事是
std::vector::clear()
不会释放向量中分配的内部空间,只会销毁包含的对象并将大小设置为0。也就是说,调用
clear()
永远不会释放内存。实际释放向量中已分配内存的模式为:

typedef std::vector<...> myvector_type;
myvector_type myvector;
...
myvector.swap( myvector_type() ); // swap with a default constructed vector
typedef std::vector myvector_type;
myvector_型myvector;
...
myvector.swap(myvector_type());//使用默认构造的向量进行交换

不要这样做。向量为您处理重新分配。RealLoad()在C++程序中的使用几乎肯定是错误的。在这个例子中,向量的向量向量,MalOC/ReAlOc/For如何不合适?至少因为在“第三”维度中我有不同的大小,如果使用向量…256×256×50×256×4=3.5 GB,我可以很容易地访问大小。真的是这样吗?恐怕是这样!但这是最大尺寸。。。平均起来大概是256*256*50*100;从技术上讲,永远不会达到最大值…>>“在模板中的处理并不总是正确的。插入空格,使其便于携带。只是唠叨。@David-你确定第一段代码中的
内部\u t
中间\u t
位正确吗?
using std::tr1::shared_ptr; // or boost::shared_ptr
typedef std::vector<int> int_t;
typedef std::vector< shared_ptr<int_t> > mid_t;
typedef std::vector< shared_ptr<mid_t> > ext_t;
typedef std::vector<...> myvector_type;
myvector_type myvector;
...
myvector.swap( myvector_type() ); // swap with a default constructed vector