繁体   English   中英

初始化STL`map`大小

[英]initialize an STL `map` size

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

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

有几种选择:

  • 您可以尝试使用带有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。

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

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

但是 ,你可以

  • 使用Boost Intrusive贴图(使用你在另一个容器中分配的元素,如矢量),用'hooks'装饰以在其上实现贴图功能

  • 将std :: map与allocator一起使用,这样就可以从固定的'pool'(内存区域)中分配所有实际元素

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

可以通过rehash模拟reserve ,如N3376中的表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()))

资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM