如何为向量的向量保留内存

How to reserve memory for vector of vector

本文关键字:向量 保留内存      更新时间:2023-10-16

假设

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. 我的概念"担心内存分配不好会导致没有为向量保留内存"正确吗?

对不起,我的英语不好,我使用vc++ 2010。

不能同时为内部外部向量预留内存…如果只在外部向量中保留空间,则不会构造内部向量。你可以调整外部向量的大小,然后为其中的每个元素做保留,或者你可以在添加内部向量时对它们做保留。

如果您确定需要这样做,我可能会调整外部向量的大小,然后在每个内部向量中保留空间。

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

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

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

BTW:检查make_shared,我相信它避免了shared_ptr的分配开销。或者,Boost也有一个使用内部引用计数器的intrusive_ptr。这些shared_ptr实例的大小也只有shared_ptr的一半。但是,您需要基准测试来实际证明哪种方式最快。