2012-06-12 80 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); 
相關問題