我有一个非常大的多维向量,其大小一直在变化。
当我只知道大小的近似值时,使用 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);
}
将元素添加到向量中...
A.clear();
在此之后,我再次从顶部做同样的事情。
我应该何时以及如何为向量保留空间。
如果我理解正确的话,如果我使用保留,因为我一直在改变尺寸,我会节省很多时间?
保留向量可以拥有的最大大小的负面/正面是什么[256*256][50][256]
在某些情况下。
顺便提一句。我知道不同的矩阵模板和Boost,但决定在这个上使用向量......
EDIT:我还想知道如何在多维数组中使用保留函数。
如果我只保留二维向量,如果我超出了其在第三维的容量,它会复制整个向量吗?
为了帮助讨论,您可以考虑以下 typedef:
typedef std::vector<int> int_t; // internal vector
typedef std::vector<int_t> mid_t; // intermediate
typedef std::vector<mid_t> ext_t; // external
增长成本(载体容量增加)int_t
只会影响该特定向量的内容,不会影响任何其他元素。成长的成本mid_t
需要复制该向量中的所有存储元素,也就是说,它将需要所有int_t
矢量,成本相当高。成长的成本ext_t
很大:需要复制all已经存储在容器中的元素。
现在,为了提高性能,获得正确的结果更为重要ext_t
大小(在你的问题中似乎固定为 256*256)。然后得到中间mid_t
大小正确,因此很少发生昂贵的重新分配。
您所讨论的内存量很大,因此您可能需要考虑不太标准的方法来解决您的问题。首先想到的是添加额外的间接级别。如果不是保存实际的向量,而是将智能指针保存到向量中,则可以减少增长向量的成本mid_t
and ext_t
向量(如果ext_t
大小是固定的,只需使用向量mid_t
)。现在,这意味着使用您的数据结构的代码将更加复杂(或者最好添加一个处理间接的包装器)。每个int_t
向量将在内存中分配一次,并且永远不会在内存中移动mid_t
or ext_t
重新分配。重新分配的成本mid_t
与分配的数量成正比int_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;
您应该考虑的另一件事是std::vector::clear()
不会释放向量中分配的内部空间,仅销毁包含的对象并将大小设置为 0。即调用clear()
永远不会释放内存。实际释放向量中分配的内存的模式是:
typedef std::vector<...> myvector_type;
myvector_type myvector;
...
myvector.swap( myvector_type() ); // swap with a default constructed vector
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)