2013-05-07 36 views
15

Przeglądałem słowniki w języku C# i wydają się one bardzo przydatne i zastanawiałem się, czy można ich używać w C++, ponieważ próbowałem wyszukiwać słowniki w C++, ale nie ma wydaje się być odpowiednikiem, który mogę znaleźć. Czy istnieje jakaś biblioteka, którą mogę pobrać i dołączyć do projektu lub czy istnieje funkcja, która robi to samo z inną nazwą.Czy słowniki mogą być używane w języku C++

Odpowiedz

15

Istnieje odpowiedni typ w STL, który nazywa się std::map.

Ma taką samą podstawową funkcjonalność jak słownik .NET, ale implementacja jest zupełnie inna. std::map jest wewnętrznie oparty na strukturze drzewa czerwono-czarnego, natomiast Dictionary używa wewnętrznie tabeli mieszania.

Jeśli szukasz czegoś o tym samym zachowaniu, zrobi to std::map, ale jeśli masz duże ilości danych, musisz pamiętać o różnych cechach wydajności.

+11

unordered_map :) – NoSenseEtAl

+2

'std :: unordered_map' implementuje funkcjonalność słownika przy użyciu tabeli mieszania (jak C# 's' Dictionary') --__ IF__ masz C++ 11 –

+2

@SchighSchagh: dobrze, zawsze jest 'boost :: unordered_map "inaczej;) –

6

Istnieje dla logarytmicznego czasu dostępu (zwykle w oparciu o implementację drzewa) i std::unordered_map (od C++ 11) dla oczekiwanego, stałego, najgorszego przypadku, liniowego czasu dostępu (zwykle w oparciu o implementację mieszania).

+0

Powiedziałbym, że standard wymaga implementacji hashowania dla 'std :: unordered_map', a nawet bardzo specyficznej wersji zarządzania kolizjami. W przeciwnym razie, co oznaczają funkcje takie jak 'bucket_count()' i 'load_factor()'? –

+0

@JamesKanze Rzeczywiście byłoby dość trudno wymyślić inną implementację 'std :: unordered_map'. Chciałem tylko podkreślić, że standard w rzeczywistości nie wymaga szczególnej implementacji, a jedynie "obserwowalne efekty" (w zdrowym tego słowa znaczeniu, a nie w standardowej definicji). – Angew

+1

* zwykle w oparciu o implementację haszowania *: Powiedziałbym, że ponieważ jedynymi predykatami, które są dostarczane są hasz (domyślnie 'std :: hash ') i komparator (domyślnie do 'std :: equal_to '), i biorąc pod uwagę ograniczenia złożoności, ** musi to być jakaś tablica skrótów. Ponadto wymagania dotyczące stabilności pamięci również ograniczają przestrzeń projektową (na przykład wykluczone jest adresowanie otwarte z relokacją przy ponownym podłączaniu). –

Powiązane problemy