如何为向量的向量保留内存
How to reserve memory for vector of vector
假设
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()
是无用的,因为这不是我想做的。
为内部向量保留内存的目的是为了更好地分配内存,以便之后更快地搜索内部元素。我只是想知道如果我不保留内存,预分配的内存是昂贵的和混乱的。
我想问:
- 是否有办法为内部向量保留内存
- 我的概念"担心内存分配不好会导致没有为向量保留内存"正确吗?
对不起,我的英语不好,我使用vc++ 2010。
不能同时为内部和外部向量预留内存…如果只在外部向量中保留空间,则不会构造内部向量。你可以调整外部向量的大小,然后为其中的每个元素做保留,或者你可以在添加内部向量时对它们做保留。
如果您确定需要这样做,我可能会调整外部向量的大小,然后在每个内部向量中保留空间。
如果100个元素接近准确,那么外部向量的空间几乎是无关的(通常是32位系统上的1200字节或64位系统上的2400字节)。
这可能不太方便(可能会迫使您跟踪创建的项和实际使用的项的数量),但如果您想在内部向量中保留空间,则没有太多选择。
我将从您将如何与最终容器进行交互以及您提前了解其内容开始。一旦选定了方便的接口,就可以实现其背后的代码。例如,您可以确保创建的每个新的内部向量都具有100个元素的容量。或者,您可以使用从x/y对到共享指针的映射,这在稀疏填充的容器中是有意义的。或者静态地分配100x100个元素,根本不重新分配呢?重要的一点是,所有这些替代方法都可以在不更改最终容器接口的情况下实现,因此这给了您尝试不同方法的自由。
BTW:检查make_shared,我相信它避免了shared_ptr的分配开销。或者,Boost也有一个使用内部引用计数器的intrusive_ptr。这些shared_ptr实例的大小也只有shared_ptr的一半。但是,您需要基准测试来实际证明哪种方式最快。
- 迭代时从向量和内存中删除对象
- 向量的内存位置不连续
- 自己的自定义向量类. 内存重新分配
- 大向量和内存守恒c++
- 故意泄漏std::向量的内存
- 为异步发送缓冲区保留内存(提升 asio 套接字)
- C++ STL 向量保留太多容量会消耗大量内存吗?
- 给出一个 std::vector 对另一个向量的内存的所有权?
- std::vector<std::vector<int>>:调试断言失败。C++矢量下标超出范围保留内存
- 如何重用先前分配给c 向量的内存块
- 如何将两个点的向量保留在一个向量中
- 递归结构的向量有内存问题
- 数组向量的内存布局是什么
- 为向量分配内存
- 如何在Windows和更高版本上保留内存,并将文件映射到内存中
- 结构中的C++数组指针保留内存位置,但丢失所有值
- 是否更正PInvoke签名以使用带有C#保留内存的嵌套结构
- 关于向量保留大内存的问题
- 如何为向量的向量保留内存
- 为什么std::deque不是一个在索引0之前保留内存的向量