2013-01-06 13 views
19

C++ 11 domyślnego konstruktora unordered_map „s wygląda następująco:Co powinienem przekazać do argumentu licznika wiad. Unordered_map, jeśli chcę tylko podać funkcję skrótu?

explicit unordered_map(size_type bucket_count = /*implementation-defined*/, 
        const hasher& hash = hasher(), 
        const key_equal& equal = key_equal(), 
        const allocator_type& alloc = allocator_type()); 

Chcę utworzyć unordered_map z funkcją zwyczaj hasher, ale jest to drugi argument do konstruktora.

Jakiej liczby wiaderek należy użyć? Czy istnieje wartość magiczna, którą mogę użyć, aby powiedzieć pojemnikowi, aby sam zdecydował? W przeciwnym razie, czy istnieje heurystyka, której mogę użyć do oszacowania dobrego numeru segmentu na podstawie liczby kluczy, które według mnie powinna zawierać moja mapa? Czy powinienem się tym przejmować?

Odpowiedz

14

Nie przejmowałbym się tym zbytnio.

Kontener gwarantuje, że liczba wiaderek będzie wynosić co najmniej podaną przez Ciebie wartość, tzn. Zwiększy ją w razie potrzeby. Możesz podać zero jako liczbę wiaderek, a implementacja zrobi coś w rodzaju std::max(count, 10) i zastąpi wartość zerową, lub po prostu powtórzy się ponownie przy pierwszym wstawianiu.

Inną alternatywą byłoby skopiować wartość z domyślnej skonstruowane obiektu:

H hasher; 
unordered_map<K,T,H,P> m{ unordered_map<K,T,H,P>{}.bucket_count(), hasher }; 

Spowoduje to ustawienie licznika wiadro na cokolwiek domyślna implementacja jest (ale nie wymaga rodzaj funkcji H hash być DefaultConstructible .)

FWIW GCC's unordered_map używa 10 jako domyślnego dla konstruktora, który pokazałeś (więc to prawdopodobnie rozsądne ustawienie domyślne) i używa 0 dla konstruktorów biorąc parę iteratorów lub initializer_list.

+0

Dobra sztuczka. Nie myślałem o tym. Dzięki za zaglądanie w to. – zneak

+2

Czy jesteś pewien co do 'std :: min'? Jeśli chcesz mieć co najmniej 10 elementów, formuła to 'std :: max (count, 10)'. – fredoverflow

2

Jednym z parametrów szablonu dla unordered_map jest funkcja skrótu. Jeśli podasz obiekt funkcji skrótu, możesz pozostawić parametry konstruktora przy ustawieniach domyślnych.

+2

O ile się z tobą zgadzam, możesz podać * typ * w haśle jako argument szablonu, ale nadal musisz podać określony obiekt haszujący w konstrukcji 'unordered_map', jeśli chcesz coś wymyślić (na przykład , jeśli twój hasher był uniwersalną rodziną funkcji haszujących i musisz określić, której z tych funkcji skrótu użyć). – templatetypedef

+0

Rapptz zasugerował, że na czacie C++. It * does * działa dla moich celów, ponieważ miałem zamiar przekazać wskaźnik funkcji (więc zawijanie go w struct nie jest biggie), a na pewno warto wspomnieć, ale jak @templatetypedef mówi, to tak naprawdę nie pomaga ludziom, którzy naprawdę trzeba podać liczbę wiaderek. – zneak

Powiązane problemy