Standardowe bardziej lub mniej wymaga stosowania segmentów do rozmiar zderzenia , co oznacza, że rzeczywista patrzeć razem prawdopodobnie liniowo zależny od liczby elementów w wiadra, niezależnie od tego, czy element ma lub nie. Możliwe jest wykonanie O (lg N), ale zwykle nie jest to robione, , ponieważ liczba elementów w wiadrze powinna być niewielka, , jeśli tabela mieszania jest używana poprawnie.
Aby upewnić się, że liczba elementów w łyżce jest mała, użytkownik musi uzyskać pewność, że funkcja mieszania jest skuteczna. To, co jest skuteczne, zależy od typów i wartości mieszanych. (W implementacji MS używany jest FNV, który jest jednym z najlepszych popularnych skrótów , ale jeśli masz specjalną wiedzę o rzeczywistych danych, które zobaczysz, być może będziesz w stanie to zrobić lepiej.) Inna rzecz, która może Pomóż zmniejszyć liczbę elementów na wiadro o rozmiarach , aby wymusić więcej łyżek lub użyć mniejszego współczynnika obciążenia. Po pierwsze, można przekazać minimalną początkową liczbę wiaderek jako argument do konstruktora. Jeśli znasz całkowitą liczbę elementów, które będą na mapie, możesz kontrolować współczynnik obciążenia w ten sposób. Po napełnieniu stołu możesz także podać minimalną liczbę kubełków , dzwoniąc pod numer rehash
. W przeciwnym razie dostępna jest funkcja, której możesz użyć. To nie może nic zrobić, ale w każdej rozsądnej implementacji będzie. Zauważ, że jeśli użyjesz go na już wypełnionym wypełnionym unordered_map
, prawdopodobnie będziesz musiał później zadzwonić pod numer unordered_map<>::rehash
.
(Istnieje kilka rzeczy, których nie rozumiem o standardowej unordered_map: dlaczego współczynnik obciążenia jest float
, zamiast double
, dlaczego to nie jest wymagane, aby mieć wpływ, a dlaczego nie automatycznie zadzwoń rehash
dla ciebie)
jestem teraz mylić odpowiedź JAKAR tutaj. http://stackoverflow.com/questions/4395050/finding-value-in-unordered-map chciałbym zinterpretować ten komentarz to znaczy można osiągnąć. Czy tak nie jest? – user1764386
@ user1764386: Cóż, find musi zwrócić * coś *, jeśli nie może zwrócić iteratora do twojej wartości, więc unordered_map :: end był najlepszym wyborem. – AndyG
dziękuję za pomoc. Chodziło mi o to, że jestem nieco zdezorientowany jego odpowiedzią, ponieważ interpretowałem to w ten sposób, że złożoność będzie lepsza niż O (N), jeśli klucz nie znajduje się w nieuporządkowanej_mapie. – user1764386