2012-06-12 39 views
1

我与unordered_set一起工作。 Here它写道它有一个reserve功能,其中 设置基于要包含的要素数N的存储桶。 然而,mpic++编译器在Ubuntu上抱怨没有储备功能: class std::tr1::unordered_set<pair_int>’ has no member named ‘reserve’如何根据元素数量选择max_load_factor?

我需要优化我的一套持有N元素, 似乎max_load_factor是可用的,我怎么跟一个基于N? 或者我可以以其他方式对其进行优化吗?

在此先感谢

P/S /看到了Java的一些讨论,但不能用于C++ STL的lib

+1

如果你的编译器支持它,使用C++ 11'的std :: unordered_set'而不是旧的' tr1'版本。这应该有一个“预留”功能。 –

回答

1

负载系数是独立的,你插入项目的数量。它基本上是实际使用的可用空间的百分比。例如,如果您当前拥有分配100个元素的空间,那么当您插入80个元素(这将对应于80%的最大负载因子)时,最大负载因子可以说开始调整表的大小。因此,设置最大负载因子在很大程度上与要存储的元素数量无关。相反,它(主要)表明您愿意使用多少额外空间来提高搜索速度。在其他条件相同的情况下,接近完整的表格会有更多的冲突,这会降低搜索速度。

1

如果要优化无序集以容纳N个元素,则需要使用rehash函数。这接受一个为该集合设置最小桶的参数。这将防止在将元素插入到集合中时发生重新散布。

举例来说,如果你想要的客座率为75%那么你的水桶大小应该N/.75

// This creates an unordered set optimized for `80` elements with a load factor of `75%` 
std::unordered_set<std::string> myset; 
myset.rehash(120); 
相关问题