gpt4 book ai didi

c++ - vector 储备 C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:21 24 4
gpt4 key购买 nike

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

所以基本上我有一个 vector

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

对于程序中的每次迭代,x 从 0 变为 50,然后再次回到 0。 y 值每次都可能不同,这意味着对于每个[256*256][y] vector 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);
}

向 vector 中添加元素...

A.clear();

然后我从顶部再次做同样的事情。

我应该何时以及如何为 vector 保留空间。如果我理解正确的话,当我一直更改尺寸时使用保留会节省很多时间吗?

在某些情况下,保留我的 vector 可以具有的最大大小的消极/积极方面是什么,这将是 [256*256][50][256]

顺便说一句。我知道不同的 Matrix Templates 和 Boost,但我决定在这个上使用 vector ...

编辑:我也想知道如何在多维数组中使用保留函数。如果我只在二维中保留 vector ,那么如果我在三维中超出其容量,它会复制整个内容吗?

最佳答案

为了帮助讨论,您可以考虑以下类型定义:

typedef std::vector<int> int_t;   // internal vector
typedef std::vector<int_t> mid_t; // intermediate
typedef std::vector<mid_t> ext_t; // external

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

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

您所说的内存量很大,因此您可能需要考虑使用不太标准的方法来解决您的问题。首先想到的是添加额外的间接级别。如果不是保存实际 vector ,而是将智能指针保存到 vector 中,则可以减少增长 mid_text_t vector 的成本(如果 ext_t大小是固定的,只需使用 mid_t 的 vector )。现在,这意味着使用您的数据结构的代码将更加复杂(或者更好地添加一个负责间接处理的包装器)。每个 int_t vector 将在内存中分配一次,并且永远不会在 mid_text_t 重新分配中移动。重新分配 mid_t 的成本与分配的 int_t vector 的数量成正比,而不是与插入的整数的实际数量成正比。

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() 不会释放 vector 中分配的内部空间,只会破坏包含的对象并将大小设置为0. 即调用clear()永远不会释放内存。实际释放 vector 中分配的内存的模式是:

typedef std::vector<...> myvector_type;
myvector_type myvector;
...
myvector.swap( myvector_type() ); // swap with a default constructed vector

关于c++ - vector 储备 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2280655/

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