Jak používat C ++ Unordered Map

How Use C Unordered Map



Mapa, známá také jako asociativní pole, je seznam prvků, kde každý prvek je dvojicí klíč/hodnota. Každý klíč tedy odpovídá hodnotě. Různé klíče mohou mít stejnou hodnotu pro běžnou práci. Klíčem může být například seznam ovoce a odpovídající hodnoty, barvy ovoce. V C ++ je mapa implementována jako datová struktura s členskými funkcemi a operátory. Objednaná mapa je ta, kde byly páry prvků seřazeny podle klíčů. Neuspořádaná mapa je ta, kde není žádný řád. Tento článek vysvětluje, jak používat neuspořádanou mapu C ++ zapsanou jako unordered_map. K pochopení tohoto článku potřebujete znalosti v ukazatelích C ++. unordered_map je součástí standardní knihovny C ++.

Třída a objekty

Třída je sada proměnných a funkcí, které spolupracují, kde proměnné nemají přiřazené hodnoty. Když jsou proměnným přiřazeny hodnoty, třída se stane objektem. Různé hodnoty dané stejné třídě vedou k různým objektům; to znamená, že různé objekty jsou stejnou třídou s různými hodnotami. Vytváření objektu ze třídy se říká o instanci objektu.







Název, unordered_map, je třída. Objekt vytvořený ze třídy unordered_map má programátorem zvolené jméno.



Funkce, která patří do třídy, je potřebná k vytvoření instance objektu ze třídy. V C ++ má tato funkce stejný název jako název třídy. Objekty vytvořené (vytvořené instancí) ze třídy mají různá jména, která jim dal programátor.



Vytvoření objektu ze třídy znamená konstrukci objektu; to také znamená instanci.





Program C ++, který používá třídu unordered_map, začíná v horní části souboru následujícími řádky:

#zahrnout
#zahrnout
pomocí oboru názvů std;

První řádek je pro vstup/výstup. Druhý řádek je umožnit programu využívat všechny funkce třídy unordered_map. Třetí řádek umožňuje programu používat jména ve standardním oboru názvů.



Přetížení funkce

Pokud mají dva nebo více různých podpisů funkcí stejný název, je tento název údajně přetížen. Při volání jedné funkce určuje počet a typ argumentů, která funkce je skutečně spuštěna.

Konstrukce/kopírování

Jednoduchá konstrukce

Neuspořádanou mapu lze sestrojit a přiřadit jí hodnoty následujícím způsobem:

unordered_map<konst char*, konst char*>umap;

umap['banán'] = 'žlutá';
umap['hroznový'] = 'zelená';
umap['fík'] = 'nachový';

Deklarace začíná specializací šablony s typy pro páry klíčů a hodnot. Následuje programátorem zvolený název mapy; pak středník. Druhý segment kódu ukazuje, jak přiřadit hodnoty jejich klíčům.
Konstrukce podle Initializer_list
To lze provést následujícím způsobem:

unordered_map<konst char*, konst char*>umap({{'banán', 'žlutá'},
{'hroznový', 'zelená'}, {'fík', 'nachový'}});

Konstrukce přiřazením Initializer_list
Příklad:

unordered_map<konst char*, konst char*>umap= {{'banán', 'žlutá'},
{'hroznový', 'zelená'}, {'fík', 'nachový'}};

Stavba zkopírováním jiné unordered_map
Příklad:

unordered_map<konst char*, konst char*>umap1({{'banán', 'žlutá'},
{'hroznový', 'zelená'}, {'fík', 'nachový'}});
unordered_map<konst char*, konst char*>umap2(umap1);

Dvojice Element

Následující kód ukazuje, jak vytvořit a získat přístup k párovému prvku:

pár<char, konst char*>pr= {'d', 'být'};
náklady<<pr.za prvé << ' n';
náklady<<pr.druhý << ' n';

Výstupem je:

d
být

první a druhé jsou vyhrazená slova pro dvě položky v páru. Hodnoty v páru lze stále měnit pomocí prvního a druhého.

Dvojice se v tématu neuspořádané mapy nazývá value_type.

unordered_map Element Access

mapped_type & operator [] (key_type && k)
Vrátí hodnotu pro odpovídající klíč. Příklad:

unordered_map<konst char*, konst char*>umap;

umap['banán'] = 'žlutá';
umap['hroznový'] = 'zelená';
umap['fík'] = 'nachový';

konst char *že jo=umap['hroznový'];

náklady<<že jo<<' n';

Výstup je: zelený. Hodnoty lze přiřadit stejným způsobem - viz výše.

unordered_map Kapacita

size_type size () const noexcept
Vrátí počet párů na mapě.

unordered_map<konst char*, konst char*>umap;

umap['banán'] = 'žlutá';
umap['hroznový'] = 'zelená';
umap['fík'] = 'nachový';

náklady<<umap.velikost() <<' n';

Výstup je 3.

bool empty () const noexcept

Vrací 1 pro true, pokud mapa nemá žádný pár, a 0 pro false, pokud má páry. Příklad:

unordered_map<konst char*, konst char*>umap;
náklady<<umap.prázdný() <<' n';

Výstup je 1.

Vracející se iterátory a třída neuspořádané mapy

Iterátor je jako ukazatel, ale má více funkcí než ukazatel.

begin () noexcept

Vrátí iterátor, který ukazuje na první pár objektu mapy, jako v následujícím segmentu kódu:

unordered_map<konst char*, konst char*>umap;

umap['banán'] = 'žlutá';umap['hroznový'] = 'zelená';umap['fík'] = 'nachový';

unordered_map<konst char*, konst char*> ::iterátoriter=umap.začít();
pár<konst char*, konst char*>pr= *iter;
náklady<<pr.za prvé << ',' <<pr.druhý << ' n';

Výstup je: obr, fialová. Mapa není objednána.

begin () const noexcept;

Vrátí iterátor, který ukazuje na první prvek kolekce objektů mapy. Když konstrukci objektu předchází const, místo begin () se provede výraz begin () const. Za této podmínky nelze prvky v objektu upravovat. Používá se například v následujícím kódu.

konstunordered_map<konst char*, konst char*>umap({{'banán', 'žlutá'},
{'hroznový', 'zelená'}, {'fík', 'nachový'}});

unordered_map<konst char*, konst char*> ::const_iteratoriter=umap.začít();
pár<konst char*, konst char*>pr= *iter;
náklady<<pr.za prvé << ',' <<pr.druhý << ' n';

Výstup je: obr, fialová. Mapa není objednána. Všimněte si toho, že tentokrát byl k přijetí vráceného iterátoru použit const_iterator, nikoli pouze iterátor.

end () noexcept

Vrátí iterátor, který ukazuje bezprostředně za poslední prvek objektu mapy.

end () const noexcept

Vrátí iterátor, který ukazuje bezprostředně za poslední prvek objektu mapy. Když konstrukci objektu mapy předchází const, místo end () se provede výraz end () const.

unordered_map Operace

iterator find (const key_type & k)

Vyhledá dvojici daného klíče na mapě. Pokud je nalezen, vrátí iterátor. Pokud není nalezen, vrátí iterátor, který ukazuje na konec mapy, což není pár. Následující kód ukazuje, jak používat tuto členskou funkci:

unordered_map<char,char>umap;

umap['na'] = 'b';umap['C'] = 'd';umap['A'] = 'F';

unordered_map<char,char> ::iterátoriter=umap.nalézt('C');
-li (umap.nalézt('C') ! =umap.konec())
{
pár<char,char>pr= *iter;
náklady<<pr.za prvé << ',' <<pr.druhý << ' n';
}

Výstup je: c, d

const_iterator find (const key_type & k) const;

Tato verze funkce se nazývá, pokud vytváření neuspořádané mapy začíná konstantou, takže všechny prvky mapy jsou jen pro čtení.

unordered_map Modifiers

pár vložení (value_type && obj)
Neuspořádaná mapa znamená, že páry nejsou v žádném pořadí. Program tedy vloží dvojici na jakékoli místo, které uzná za vhodné. Funkce se vrátí, spárujte. Pokud bylo vložení úspěšné, bool bude 1 pro true, jinak by byl 0 pro false. Pokud je vložení úspěšné, iterátor bude ukazovat na nově vložený prvek. Následující kód ilustruje použití:

unordered_map<konst char*, konst char*>umap;

umap['banán'] = 'žlutá';
umap['hroznový'] = 'zelená';
umap['fík'] = 'nachový';

umap.vložit({{'třešeň', 'síť'}, {'jahoda', 'síť'}});

náklady<<umap.velikost() << ' n';

Výstup je: 5. Lze vložit více než jeden pár.

size_type erase (const key_type & k)

Tato funkce vymaže pár z mapy unordered_map. Následující segment kódu ukazuje:

unordered_map<konst char*, konst char*>umap;

umap['banán'] = 'žlutá';
umap['hroznový'] = 'zelená';
umap['fík'] = 'nachový';

intna jednom=umap.vymazat('hroznový');

náklady<<umap.velikost() << ' n';

Výstup je 2.
void swap (unordered_map &)
Dvě neuspořádané mapy lze vyměnit, jak je znázorněno v tomto segmentu kódu:

unordered_map<konst char*, konst char*>umap1= {{'banán', 'žlutá'},
{'hroznový', 'zelená'}, {'fík', 'nachový'}, {'jahoda', 'síť'}};

unordered_map<konst char*, konst char*>umap2= {{'třešeň', 'síť'}, {'Limetka', 'zelená'}};

umap1.vyměnit(umap2);

unordered_map<konst char*, konst char*> ::iterátoriter1=umap1.začít();
pár<konst char*, konst char*>pr1= *iter1;
unordered_map<konst char*, konst char*> ::iterátoriter2=umap2.začít();
pár<konst char*, konst char*>pr2= *iter2;

náklady<< 'První klíč a velikost umap1:'<<pr1.za prvé <<','<<umap1.velikost() << ' n';
náklady<< „První klíč a velikost umap2“<<pr2.za prvé <<','<<umap2.velikost() << ' n';
unordered_map<konst char*, konst char*>umap1= {{'banán', 'žlutá'},
{'hroznový', 'zelená'}, {'fík', 'nachový'}, {'jahoda', 'síť'}};
unordered_map<konst char*, konst char*>umap2= {{'třešeň', 'síť'}, {'Limetka', 'zelená'}};

umap1.vyměnit(umap2);

unordered_map<konst char*, konst char*> ::iterátoriter1=umap1.začít();
pár<konst char*, konst char*>pr1= *iter1;
unordered_map<konst char*, konst char*> ::iterátoriter2=umap2.začít();
pár<konst char*, konst char*>pr2= *iter2;

náklady<< 'První klíč a velikost umap1:'<<pr1.za prvé <<','<<umap1.velikost() << ' n';
náklady<< „První klíč a velikost umap2“<<pr2.za prvé <<','<<umap2.velikost() << ' n';

Výstupem je:

První klíč a velikost umap1: vápno, 2

První klíč a velikost jahody umap2, 4

Mapa není objednána. V případě potřeby se délka mapy prodlouží. Datové typy musí být stejné.

Třída a její instancované objekty

Hodnota je pro datový typ, protože instancovaný objekt je pro třídu. Neuspořádaná konstrukce mapy může také přijmout třídu jako datový typ. Následující program to ilustruje:

#zahrnout
#zahrnout
pomocí oboru názvů std;

třída TheCla
{
veřejnost:
intna jednom;
statický charch;

prázdnéfunkce(charNe, konst char *p)
{
náklady<< 'Existují ' <<na jednom<< „knihy, které stojí za to“ <<Ne<<p<< ' v obchodě.' << ' n';
}
statický prázdnézábava(charch)
{
-li (ch== 'na')
náklady<< 'Oficiální statická členská funkce' << ' n';
}
};

inthlavní()
{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

unordered_map<konst char*,TheCla>umap;
umap= {{'banán',obj1}, {'hroznový',obj2}, {'fík',obj3}, {'jahoda',obj4}, {'Limetka',obj5}};

náklady<<umap.velikost() << ' n';

vrátit se 0;
}

Výstup je: 5.

Definice třídy má dva veřejné datové členy a dvě veřejné členské funkce. Ve funkci main () se vytvoří instance různých objektů pro třídu. Poté se vytvoří instance neuspořádané mapy, kde každá dvojice se skládá ze jména ovoce a předmětu ze třídy. Zobrazí se velikost mapy. Program se kompiluje bez varování nebo chybových zpráv.

Aplikace mapy

Pole spojuje index s hodnotou. Páry klíč/hodnota existují v mnoha životních situacích, které lze naprogramovat. Pár klíč/hodnota ovoce/barvy je jen jedním příkladem. Dalším příkladem je jméno lidí a jejich věk. V tomto případě bude dvojice typu, pár. Může být i párový. V druhém případě bude použita směrnice o předběžném zpracování. Dvojicí klíč/hodnota mohou být stále jména manželských párů. V zemích, kde je mnohoženství, budou pro jednoho muže různé manželky.

Vytvoření mapy

Mapa není dvourozměrné pole se dvěma sloupci. Mapa funguje s hashovací funkcí. Klíč je kódován funkcí hash do celého čísla pole. Toto pole uchovává hodnoty. Ve skutečnosti tedy existuje jedno pole s hodnotami a klíče jsou mapovány na indexy pole, a tak jsou vytvářeny korespondence mezi klíči a hodnotami. Hašování je rozsáhlé téma a není v tomto článku zahrnuto.

Závěr

Mapa, známá také jako asociativní pole, je seznam prvků, kde každý prvek je dvojicí klíč/hodnota. Každý klíč tedy odpovídá hodnotě. V C ++ je mapa implementována jako datová struktura s členskými funkcemi a operátory. Objednaná mapa je ta, kde byly páry prvků seřazeny podle klíčů. Neuspořádaná mapa je ta, kde není žádné objednávání.

Technicky se hash skládá z párových prvků. Ve skutečnosti je tato dvojice celá datová struktura s jejími členskými funkcemi a operátory. Dva parametry šablony pro pár jsou stejné dva parametry šablony pro unordered_map.

Seznam inicializátorů pro mapu je literál pole literálů. Každý interní literál se skládá ze dvou objektů, dvojice klíč/hodnota.

Členské funkce a operátory pro unordered_map lze kategorizovat do následujících nadpisů: unordered_map construction/copy constructing, unordered_map Capacity, unordered_map iterator, unordered_map Operations, and unordered_map Modifiers.

Neuspořádaná mapa se používá, když má být klíč namapován na hodnotu.

Chrys