我正在编写代码,将数据库中的行插入到向量中。然后将这些向量存储在std::map中。这种架构允许我根据映射键逻辑地分区数据集(向量)。
在我的代码中,我将从std::map中检索数据集(即向量),向其中添加/删除行或对其执行其他逻辑,然后将向量重新放入映射中(所有这些都在while()循环中进行)。
我有两个问题,这两个问题都与向量中存储的(可能)大量元素有关。向量可以容纳从几十个到数万个元素的任何内容。我无法事先知道从数据库中检索到多少条记录。因此,std::vector的内存管理方案(即alloc/dealloc)变得非常重要,以便有效地使用内存,并避免不必要的(内存)碎片:
我的问题是:
1. 鉴于一行可能存储的大量元素,理想情况下,我希望从内存池中分配/释放。但是我不知道如何使用带有内存池的std::vector,也不知道是否会过于复杂。如果这是过度设计(或过于复杂),那么我的另一个想法是在创建向量时预先分配固定大小的内存块。但是这也很可能过于简单,因为元素的数量很可能从一个向量实例到另一个向量实例变化很大-导致(内存)碎片等问题,更不用说内存的低效使用了。
这里推荐的方法是什么?
2. 鉴于std::map(所有STL容器,如果我没记错)存储值元素的副本,复制包含几万个元素的向量的前景是完全错误的。因此,我考虑编写一个SmartPointerMap包装器,将指针存储到向量而不是实际向量中。
我是否正确?如果不是,有更好的解决方案吗?如果是,是否有我可以使用的boost库(而不是编写我的SmartPointerMap类模板)?
在我的代码中,我将从std::map中检索数据集(即向量),向其中添加/删除行或对其执行其他逻辑,然后将向量重新放入映射中(所有这些都在while()循环中进行)。
我有两个问题,这两个问题都与向量中存储的(可能)大量元素有关。向量可以容纳从几十个到数万个元素的任何内容。我无法事先知道从数据库中检索到多少条记录。因此,std::vector的内存管理方案(即alloc/dealloc)变得非常重要,以便有效地使用内存,并避免不必要的(内存)碎片:
我的问题是:
1. 鉴于一行可能存储的大量元素,理想情况下,我希望从内存池中分配/释放。但是我不知道如何使用带有内存池的std::vector,也不知道是否会过于复杂。如果这是过度设计(或过于复杂),那么我的另一个想法是在创建向量时预先分配固定大小的内存块。但是这也很可能过于简单,因为元素的数量很可能从一个向量实例到另一个向量实例变化很大-导致(内存)碎片等问题,更不用说内存的低效使用了。
这里推荐的方法是什么?
2. 鉴于std::map(所有STL容器,如果我没记错)存储值元素的副本,复制包含几万个元素的向量的前景是完全错误的。因此,我考虑编写一个SmartPointerMap包装器,将指针存储到向量而不是实际向量中。
我是否正确?如果不是,有更好的解决方案吗?如果是,是否有我可以使用的boost库(而不是编写我的SmartPointerMap类模板)?