8

是否可以初始化 STLmap大小?

我知道最后我的地图中有多少元素,我想在一开始就分配所有需要的内存。

4

4 回答 4

6

有几种选择:

  • 您可以尝试将 map 与 statefull 分配器一起使用。例如来自Boost.Container或来自 C++11。或者,如果您接受无状态分配器的限制,那么您甚至可以使用 C++98/03 中的 map。

  • 考虑使用 unordered_map(同样来自 Boost 或 C++11)——它将桶数作为构造函数参数。它与 map 的不同之处在于它基于散列而不是严格的弱排序。

  • 另一种选择是来自Boost的 flat_map 。它具有保留成员功能。平面地图/套装说明

Boost.Container flat_[multi]map/set 容器是基于 Austern 和 Alexandrescu 指南的基于有序向量的关联容器

  • 或者,如果 boost 不可用 - 那么您可以简单地使用 std::vector + std::sort + std::lower_bound (或将它们包装到类似类的小型 flat_map )。即,只需将您的元素放入向量(无序),然后对其进行排序,然后 - 当您需要按键查询元素时 - 只需使用 lower_bound。

哪个选择更好 - 取决于您的使用模式。

于 2012-11-09T00:54:23.960 回答
4

你不能。它是一棵树(通常是红黑树)。实际值将决定内存布局。

但是,您可以

  • 使用Boost Intrusive地图(使用您在另一个容器中分配的元素,如矢量),用“钩子”装饰以在其上实现地图功能

  • 将 std::map 与分配器一起使用,因此您可以从固定的“池”(内存区域)分配所有实际元素

于 2012-11-09T00:51:25.173 回答
1

我唯一能想到的就是使用它的迭代器构造函数。唯一的窍门是,您必须创建另一个具有所需大小的容器,并将其迭代器提供给构造函数。

于 2012-11-09T00:53:18.040 回答
0

reserve可以通过N3376rehash中的表 103 进行仿真。

a.rehash(n) 
Post: a.bucket_count() > a.size() / a.max_load_factor() 
      and a.bucket_count() >= n.

a.reserve(n) Same as a.rehash(ceil(n / a.max_load_factor()))

来源

于 2012-11-09T00:53:11.333 回答