2009-10-29 15 views
39

Niedawno odkryłem, że implementacja mapy skrótu w C++ będzie się nazywała unordered_map.Różnica między hash_map a unordered_map?

Kiedy spojrzałem w górę, dlaczego nie były one tylko za pomocą hash_map, odkryłem, że widocznie są problemy ze zgodnością realizacji hash_map że unordered_map ustąpieniu (więcej na ten temat here).

Ta strona wiki nie zawiera dużo więcej informacji, więc zastanawiam się, czy ktoś nie znał niektórych problemów z hash_map, które ustala unordered_map.

Odpowiedz

63

Ponieważ nie było tabeli mieszania zdefiniowanej w standardowej bibliotece C++, różne implementatory standardowych bibliotek udostępniałyby niestandardową tablicę skrótów o nazwie hash_map. Ponieważ te implementacje nie zostały napisane zgodnie ze standardem, wszystkie miały subtelne różnice w zakresie funkcjonalności i gwarancji wydajności.

Począwszy od C++11 implementacja tablicy mieszającej została dodana do standardowego standardu biblioteki C++. Postanowiono użyć alternatywnej nazwy klasy, aby zapobiec kolizjom z tymi niestandardowymi implementacjami i zapobiec nieumyślnemu użyciu nowej klasy przez programistów, którzy mieli kod hash_table.

Wybrana alternatywna nazwa to unordered_map, która jest bardziej opisowa, ponieważ wskazuje na interfejs mapy klasy i nieuporządkowany charakter jej elementów.

+4

A to jedna z rzeczy, które pokazują, że przestrzeń nazw 'std' nie spełniała dokładnie tego, na co liczyła. Nie, żebym wiedział, co by w rozsądny sposób zapobiegło temu problemowi. –

+1

Zagnieżdżona przestrzeń nazw, taka jak tr1 ... –

+0

MSVC ma standardową bibliotekę rozszerzającą. – Puppy