初始化一个STL `map`的大小。

9

是否可能初始化STL map的大小?

我知道我的地图最终会有多少元素,并且我想在一开始就分配所有所需的内存。


1
你有哪些使用模式?你有任何删除操作吗?还是只是最初的填充,然后无需更改地使用? - Evgeny Panasyuk
我需要用零进行初始化,然后再逐个增加。 - MBZ
4个回答

6
有几个选项可供选择:
  • 您可以尝试使用带有statefull分配器的map。例如从Boost.Container或C++11中。或者,如果您接受非statefull分配器的限制,则甚至可以使用来自C++98/03的map。

  • 考虑使用unordered_map(再次来自Boost或C++11)-它将buckets count作为构造函数参数。它与map不同,因为它基于哈希而不是基于严格弱排序。

  • 另一个选择是来自Boost的flat_map。它有reserve成员函数。 flat map / set的说明

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

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

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


5
您无法这样做。它是一棵树(通常是红黑树)。实际的值将确定内存布局。
然而,您可以:
- 使用 Boost Intrusive 映射(使用您在另一个容器中分配的元素,并用“钩子”来实现其上的映射功能) - 使用带有分配器的 std::map,以便您可以从固定的“池”(内存区域)中分配所有实际元素。

1
唯一我想到的是使用它的迭代器构造函数。唯一的诀窍就是,然后你必须创建一个具有所需大小的另一个容器,并将其迭代器传递给构造函数。

0

reserve 可以通过 N3376 中的表格 103 中的 rehash 进行仿真。

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()))

来源


3
这是针对std::unordered_map<>的,而不是std::map<> - ildjarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接