2014-04-02 15 views
10

Wiem, jak używać std::unordered_map::emplace, ale jak używać emplace_hint? Ani cplusplus ani cppreference nie dostarczają zestawu przykładów ilustrujących, w jaki sposób możemy wiedzieć, gdzie umieścić element.Kiedy używasz std :: unordered_map :: emplace_hint?

Czy ktoś może podać jakieś informacje na ten temat lub podać przykłady/ilustracje, kiedy możemy wiedzieć, gdzie powinien się znaleźć element umieszczony na stronie?

Odpowiedz

14

Co może zrobić z tą podpowiedzią unordered_map? Cóż, jeśli iterator adresuje element z tym samym kluczem co element, który został poproszony o wstawienie elementu, który został zgłoszony jako emplace_hint, to może szybko zawieść - tylko porównanie klucza bez mieszania lub szukania listy elementów powodujących kolizję w tym segmencie. Jeśli jednak klucz się nie zgadza, wskazówka jest bezużyteczna, ponieważ jakikolwiek inny klucz - nie ważne jak "bliski" w wartości - powinien (probabilistycznie) znajdować się w całkowicie niezwiązanym wiadrze (biorąc pod uwagę to, co normalnie uważa się za "dobrą" funkcję skrótu), więc czas byłby zmarnowany na kluczowe porównanie, aby zacząć od nowa, jak gdyby był normalnym emplace.

Może to być przydatne, gdy wstawia się elementy posortowane według klucza, mające na celu usunięcie wielu duplikatów w procesie, ale klucz jest tak duży, że łatwiej jest zachować iterator do właśnie wstawionego elementu niż kopia klucza, a może funkcja hash jest szczególnie powolna.

Inną zaletą unordered_map::emplace_hint jest lepsza kompatybilność z map::emplace_hint API, więc kod może zmienić typ kontenera i mieć emplace_hint y nie złamać kompilacji, choć mogą skończyć się wolniej niż jeśli kod zostały włączone do emplace() jako powiększonych ale-różne-kluczowe wskazówki, które pomagają z map mogą być bezużyteczne z unordered_map.

+0

Nie otrzymałem tej odpowiedzi w całości. Być może wynika to z jej brzmienia. Więc to bezużyteczne, chyba że wcześniej zamówiłem wiele kluczy? – Dean

+0

@Dean: niekoniecznie musisz mieć "wstępnie zamówione klawisze wielokrotne" - może się zdarzyć, że kolejność, w której występują naturalnie, oznacza, że ​​powtarzające się klucze mają wystarczająco wysokie prawdopodobieństwo wystąpienia po kolei, aby utrzymywać wokół iteratora do wartość ostatnio umieszczona jest warta zachodu, ponieważ możesz szybko odrzucić duplikat. Wszystko to opiera się na jedynym możliwym zastosowaniu podpowiedzi, którą mogę wymyślić - jeśli twoja implementacja nie korzysta z podpowiedzi, marnujesz czas i wysiłek dostarczając jej. –

Powiązane problemy