vector reserve c ++

5 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 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);
}
Run Code Online (Sandbox Code Playgroud)

向向量添加元素......

A.clear();
Run Code Online (Sandbox Code Playgroud)

在此之后,我再次从顶部做同样的事情.

何时以及如何为矢量预留空间.如果我已经正确地理解了这一点,如果我一直使用保留,因为我会一直改变大小,我会节省很多时间吗?

保留我的载体可能具有的最大尺寸的负面/正面是什么,[256*256][50][256]在某些情况下会是这样.

BTW.我知道不同的Matrix模板和Boost,但已经决定在这个上使用向量...

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

Dav*_*eas 4

为了帮助讨论,您可以考虑以下 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
Run Code Online (Sandbox Code Playgroud)

增长成本(向量容量增加)int_t只会影响该特定向量的内容,不会影响任何其他元素。增长的成本mid_t需要复制该向量中的所有存储元素,也就是说,它将需要所有向量int_t,这是相当昂贵的。增长的成本ext_t是巨大的:它需要复制容器中已经存储的所有元素。

现在,为了提高性能,获得正确的大小更为重要ext_t(在您的问题中似乎固定为 256*256)。然后获得正确的中间mid_t大小,以便很少发生昂贵的重新分配。

您所讨论的内存量很大,因此您可能需要考虑不太标准的方法来解决您的问题。首先想到的是添加额外的间接级别。mid_t如果不是保存实际的向量,而是将智能指针保存到向量中,则可以减少增长和ext_t向量的成本(如果ext_t大小固定,则只需使用 的向量mid_t)。现在,这意味着使用您的数据结构的代码将更加复杂(或者最好添加一个处理间接的包装器)。每个int_t向量将在内存中分配一次,并且永远不会在重新分配mid_text_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;
Run Code Online (Sandbox Code Playgroud)

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

typedef std::vector<...> myvector_type;
myvector_type myvector;
...
myvector.swap( myvector_type() ); // swap with a default constructed vector
Run Code Online (Sandbox Code Playgroud)