2012-11-09 342 views
8

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

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

+1

你有哪些使用模式?你有删除吗?或者它只是初始填充,然后没有改变的使用? –

+0

我需要用零初始化,然后递增。 – MBZ

回答

6

有几种选择:

  • 您可以尝试使用地图有状态的分配器。例如从Boost.Container或从C++ 11。或者,如果您接受非状态分配器的限制,那么您甚至可以使用C++ 98/03中的映射。

  • 考虑使用unordered_map(再次来自Boost或C++ 11) - 它需要将存储区计为构造函数参数。它不同于map,因为它基于散列而不是严格的弱排序。

  • 另一种选择是Boost的flat_map。它具有储备成员函数。平坦映射/套Description

基于Austern的Boost.Container flat_ [多]地图/组容器是基于有序向量关联容器和Alexandrescu的的准则

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

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

+1

+1 for flat_map。 – ildjarn

4

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

然而,你可以

  • 使用Boost Intrusive地图(其使用在另一容器中分配,就像一个向量的元素),缀以“挂钩”,实现对地图功能它

  • 使用std :: map与分配器,所以你可以分配所有的实际元素从一个固定的'池'(内存区域)

0

reserve可以通过rehashN3376被仿真,如表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())) 

Source

+3

这是为'std :: unordered_map <>',而不是'std :: map <>'。 – ildjarn

1

我能想到的唯一的事情就是用它的迭代器的构造函数。唯一的窍门是,那么你必须创建另一个具有所需大小的容器,并将其迭代器赋予构造函数。