如何为矢量矢量保留记忆

时间:2013-04-25 17:18:14

标签: c++

假设

vector<vector<shared_ptr<Base>>> vec
vec.reserve(100)
vec[0].reserve(20)  // Error : vector subscript out of range

我正在尝试为外部向量和内部向量保留内存。 我知道vec是空的,所以我不能为内部向量保留内存。之后我只能resize()shrink_to_fit()。但是,使用resize()shrink_to_fit()是没用的,因为这不是我想要做的。

为内部向量保留内存的意图是尝试很好地分配内存,以便以后更快地搜索内部元素。我只是想知道如果我不保留内存,预先分配的内存是昂贵和混乱。

我想问一下:

  1. 有没有办法为内部载体保留内存
  2. 我的“关于内存分配错误的概念是否会在没有为矢量保留内存的情况下引起”是否正确?
  3. 抱歉我的英语很差,我使用的是VC ++ 2010。

3 个答案:

答案 0 :(得分:4)

您不能为内部外部向量保留内存......如果您'内部向量不会被构造只在外部向量中保留空间。您可以调整外部矢量的大小,然后为其中的每个元素执行保留,或者可以在添加内部矢量时对其进行保留。

答案 1 :(得分:2)

如果您确定需要完成此操作,我可能会调整外部矢量的大小,然后在每个内部矢量中保留空间。

如果100个元素甚至接近准确,那么外部向量的空间无论如何几乎都是无关紧要的(通常在32位系统上为1200字节,在64位系统上为2400字节)。

这可能不太方便(可能会强制您跟踪创建的项目与实际使用的数量)但如果您想在内部向量中保留空间,则实际上并没有很多选择。

答案 2 :(得分:0)

我将首先介绍如何与最终容器进行交互以及您对其内容的了解。一旦您找到了方便的界面,就可以实现它背后的代码。例如,您可以确保使用100个元素的容量创建每个新的内部向量。或者,您可以使用从x / y对到共享指针的映射,这在稀疏填充的容器中是有意义的。或者如何静态分配100x100元素并且根本不重新分配?重要的是,所有这些替代方案都可以在不改变最终容器接口的情况下实现,因此这使您可以自由地尝试不同的方法。

BTW:查看make_shared,我相信这可以避免shared_ptr的分配开销。或者,Boost还有一个intrusive_ptr,它使用内部参考计数器。这些shared_ptr实例的大小也只是shared_ptr的一半。但是,您需要基准来实际证明哪种方式最快。其他任何东西或多或少都是模糊的猜测和猜测。