初始化STL`map`大小

MBZ*_*MBZ 8 c++ map

是否可以初始化STL map大小?

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

Evg*_*yuk 6

有几种选择:

  • 您可以尝试使用带有statefull分配器的map.例如,来自Boost.Container或来自C++ 11.或者,如果您接受非statefull分配器的限制,那么您甚至可以使用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.

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


seh*_*ehe 5

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

不过,您可以

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

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