Neuspořádané asociativní kontejnery (C ++) - Unordered associative containers (C++)
C ++ standardní knihovna |
---|
Kontejnery |
C standardní knihovna |
V programovacím jazyce C ++, neuspořádané asociativní kontejnery jsou skupinou šablon tříd v C ++ standardní knihovna které implementují hash tabulka varianty. Bytost šablony, lze je použít k ukládání libovolných prvků, jako jsou celá čísla nebo vlastní třídy. V aktuální revizi standardu C ++ jsou definovány následující kontejnery: unordered_set
, unordered_map
, unordered_multiset
, unordered_multimap
. Každý z těchto kontejnerů se liší pouze na omezeních umístěných na jejich prvcích.
Neuspořádané asociativní kontejnery jsou podobné asociativní kontejnery ve standardní knihovně C ++, ale mají různá omezení. Jak naznačuje jejich název, prvky v neuspořádaných asociativních kontejnerech nejsou nařízeno. To je způsobeno použitím hashování k ukládání objektů. Kontejnery mohou být stále iterováno skrz jako běžný asociativní kontejner.
Dějiny
První široce používaná implementace hash tabulek v jazyce C ++ byla hash_map
, hash_set
, hash_multimap
, hash_multiset
šablony tříd Křemíková grafika (SGI) Standardní knihovna šablon (STL).[1] Kvůli jejich užitečnosti byly později zahrnuty do několika dalších implementací standardní knihovny C ++ (např Sbírka překladačů GNU (GCC) libstdc ++[2] a Visual C ++ (MSVC) standardní knihovna).
The hash_ *
šablony tříd byly navrženy do C ++ technická zpráva 1 (C ++ TR1) a byly přijaty pod jmény neuspořádané_ *
.[3] Později byly začleněny do C ++ 11 revize standardu C ++.[4] Implementace je k dispozici také v Zvyšte knihovny C ++ tak jako <boost/unordered_map.hpp>
.[5]
Přehled funkcí
Kontejnery jsou definovány v záhlavích pojmenovaných za názvy kontejnerů, např. unordered_set
je definován v záhlaví <unordered_set>
. Všechny kontejnery splňují požadavky Kontejner pojem, což znamená, že mají začít()
, konec()
, velikost()
, max_size ()
, prázdný()
, a vyměnit ()
metody.
unordered_set (C ++ 11 ) | unordered_map (C ++ 11) | unordered_multiset (C ++ 11) | unordered_multimap (C ++ 11) | Popis | |
---|---|---|---|---|---|
(konstruktér) | (konstruktér) | (konstruktér) | (konstruktér) | Konstruuje kontejner z různých zdrojů | |
(destruktor) | (destruktor) | (destruktor) | (destruktor) | Zničí sadu a obsažené prvky | |
operátor = | operátor = | operátor = | operátor = | Přiřadí hodnoty kontejneru | |
get_allocator | get_allocator | get_allocator | get_allocator | Vrátí alokátor použitý k alokaci paměti pro prvky | |
Přístup k prvku | N / A | v | N / A | N / A | Přistupuje k zadanému prvku s kontrolou hranic. |
N / A | operátor[] | N / A | N / A | Přistupuje k zadanému prvku bez kontroly hranic. | |
Iterátory | začít | začít | začít | začít | Vrátí iterátor na začátek kontejneru |
konec | konec | konec | konec | Vrátí iterátor na konec kontejneru | |
Kapacita | prázdný | prázdný | prázdný | prázdný | Zkontroluje, zda je kontejner prázdný |
velikost | velikost | velikost | velikost | Vrátí počet prvků v kontejneru. | |
max_size | max_size | max_size | max_size | Vrátí maximální možný počet prvků v kontejneru | |
Modifikátory | Průhledná | Průhledná | Průhledná | Průhledná | Vymaže obsah. |
vložit | vložit | vložit | vložit | Vloží prvky. | |
umístit | umístit | umístit | umístit | Vytváří prvky na místě (C ++ 11 ) | |
emplace_hint | emplace_hint | emplace_hint | emplace_hint | Vytváří prvky na místě pomocí nápovědy (C ++ 11 ) | |
vymazat | vymazat | vymazat | vymazat | Vymaže prvky. | |
vyměnit | vyměnit | vyměnit | vyměnit | Zamění obsah za jiný kontejner. | |
Vzhlédnout | počet | počet | počet | počet | Vrátí počet prvků odpovídajících konkrétnímu klíči. |
nalézt | nalézt | nalézt | nalézt | Najde prvek se specifickým klíčem. | |
stejný_rozsah | stejný_rozsah | stejný_rozsah | stejný_rozsah | Vrátí řadu prvků odpovídajících konkrétnímu klíči. | |
Rozhraní lopaty | ... | ||||
Hash politika | ... | ||||
Pozorovatelé | hash_function | hash_function | hash_function | hash_function | Vrátí funkci použitou k vytvoření hodnoty hash klíče |
key_eq | key_eq | key_eq | key_eq | Vrátí funkci porovnání klíčů. |
Příklad použití
#zahrnout <iostream>#zahrnout <string>#zahrnout <unordered_map> int hlavní(){ std::unordered_map<std::tětiva, int> měsíce; měsíce["leden"] = 31; měsíce["Únor"] = 28; měsíce["březen"] = 31; měsíce["duben"] = 30; měsíce["smět"] = 31; měsíce["červen"] = 30; měsíce["červenec"] = 31; měsíce["srpen"] = 31; měsíce["září"] = 30; měsíce["říjen"] = 31; měsíce["listopad"] = 30; měsíce["prosinec"] = 31; std::cout << „září ->“ << měsíce["září"] << std::konec; std::cout << „duben ->“ << měsíce["duben"] << std::konec; std::cout << „prosinec ->“ << měsíce["prosinec"] << std::konec; std::cout << „únor ->“ << měsíce["Únor"] << std::konec; vrátit se 0;}
Vlastní hash funkce
Chcete-li použít vlastní objekty v std :: unordered_map, musí být definována vlastní hash funkce. Tato funkce přebírá const odkaz na vlastní typ a vrací size_t
#zahrnout <unordered_map> struktur X{int i,j,k;};struktur hash_X{ size_t operátor()(konst X &X) konst{ vrátit se std::hash<int>()(X.i) ^ std::hash<int>()(X.j) ^ std::hash<int>()(X.k); }};
Uživatelem definovanou funkci lze použít tak, jak je v std :: unordered_map, předáním jako parametr šablony
std::unordered_map<X,int,hash_X> moje_mapa;
Nebo lze nastavit jako výchozí hashovací funkci specializací funkce std :: hash
jmenný prostor std { šablona <> třída hash<X>{ veřejnost : size_t operátor()(konst X &X ) konst{ vrátit se hash<int>()(X.i) ^ hash<int>()(X.j) ^ hash<int>()(X.k); } };}//... std::unordered_map<X,int> moje_mapa;
Reference
- ^ "hash_map
" . Křemíková grafika (SGI). Citováno 26. ledna 2011. - ^ "libstdc ++: hash_map reference šablony třídy". Citováno 26. ledna 2011.
- ^ WG21 (9. dubna 2003). „Návrh na přidání hashovacích tabulek do standardní knihovny (revize 4)“. n1456.
- ^ WG21 (21. srpna 2010), Pracovní koncept, standard pro programovací jazyk C ++ (PDF), n3126
- ^ „Šablona třídy unordered_map“. Zvýšit. Citováno 26. ledna 2011.