Hoe C++ ongeordende kaart te gebruiken

How Use C Unordered Map



Een kaart, ook wel een associatieve array genoemd, is een lijst met elementen, waarbij elk element een sleutel/waarde-paar is. Elke sleutel komt dus overeen met een waarde. Verschillende sleutels kunnen dezelfde waarde hebben, voor gewoon werk. De sleutels kunnen bijvoorbeeld een lijst met vruchten zijn en de bijbehorende waarden, de kleuren van de vruchten. In C++ is de kaart geïmplementeerd als een gegevensstructuur met lidfuncties en operators. Een geordende kaart is er een waar de elementparen zijn geordend op sleutels. Een ongeordende kaart is er een waar geen volgorde is. In dit artikel wordt uitgelegd hoe u C++ ongeordende kaart gebruikt, geschreven als unordered_map. U hebt kennis van C++-aanwijzers nodig om dit artikel te begrijpen. unordered_map maakt deel uit van de C++ standaardbibliotheek.

Klasse en objecten

Een klasse is een verzameling variabelen en functies die samenwerken, waarbij aan de variabelen geen waarden zijn toegewezen. Wanneer waarden aan de variabelen worden toegewezen, wordt de klasse een object. Verschillende waarden die aan dezelfde klasse worden gegeven, resulteren in verschillende objecten; dat wil zeggen, verschillende objecten zijn dezelfde klasse met verschillende waarden. Het maken van een object uit een klasse zou het object instantiëren.







De naam, unordered_map, is een klasse. Een object dat is gemaakt op basis van de klasse unordered_map heeft een door de programmeur gekozen naam.



Een functie die bij een klasse hoort, is nodig om een ​​object uit de klasse te instantiëren. In C++ heeft die functie dezelfde naam als de naam van de klasse. Objecten die vanuit de klasse zijn gemaakt (geïnstantieerd) hebben verschillende namen die door de programmeur zijn gegeven.



Een object uit de klasse maken betekent het object construeren; het betekent ook instantiëren.





Een C++-programma dat de klasse unordered_map gebruikt, begint met de volgende regels bovenaan het bestand:

#erbij betrekken
#erbij betrekken
namespace std; gebruiken;

De eerste regel is voor invoer/uitvoer. De tweede regel is om het programma alle functies van de klasse unordered_map te laten gebruiken. Met de derde regel kan het programma de namen in de standaardnaamruimte gebruiken.



Een functie overbelasten

Wanneer twee of meer verschillende functiehandtekeningen dezelfde naam hebben, wordt die naam overbelast genoemd. Wanneer een functie wordt aangeroepen, bepalen het aantal en het type argumenten welke functie daadwerkelijk wordt uitgevoerd.

Constructie/Kopie Constructie

Eenvoudige constructie

Een ongeordende kaart kan als volgt worden geconstrueerd en toegewezen:

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

umap['banaan'] = 'geel';
umap['druif'] = 'groente';
umap['vijg'] = 'paars';

De aangifte begint met de sjabloonspecialisatie met de typen voor de sleutel- en waardeparen. Dit wordt gevolgd door de door de programmeur gekozen naam voor de kaart; dan een puntkomma. Het tweede codesegment laat zien hoe waarden aan hun sleutels kunnen worden toegewezen.
Constructie door Initializer_list
Dit kan als volgt:

unordered_map<const char*, const char*>umap({{'banaan', 'geel'},
{'druif', 'groente'}, {'vijg', 'paars'}});

Constructie door Initializer_list toe te wijzen
Voorbeeld:

unordered_map<const char*, const char*>umap= {{'banaan', 'geel'},
{'druif', 'groente'}, {'vijg', 'paars'}};

Constructie door een andere ongeordende_map te kopiëren
Voorbeeld:

unordered_map<const char*, const char*>umap1({{'banaan', 'geel'},
{'druif', 'groente'}, {'vijg', 'paars'}});
unordered_map<const char*, const char*>umap2(umap1);

Het paar Element

De volgende code laat zien hoe u het paarelement kunt maken en openen:

paar-<char, const char*>pr= {'NS', 'zijn'};
kosten<<pr.eerst << 'N';
kosten<<pr.tweede << 'N';

De uitvoer is:

NS
zijn

eerste en tweede zijn gereserveerde woorden voor de twee items in het paar. De waarden in het paar kunnen nog steeds worden gewijzigd met behulp van eerste en tweede.

Een paar wordt value_type genoemd in het onderwerp van de ongeordende kaart.

unordered_map Elementtoegang

mapped_type& operator[](key_type&& k)
Retourneert de waarde voor de bijbehorende sleutel. Voorbeeld:

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

umap['banaan'] = 'geel';
umap['druif'] = 'groente';
umap['vijg'] = 'paars';

const char *Rechtsaf=umap['druif'];

kosten<<Rechtsaf<<'N';

De output is: groen. Waarden kunnen op dezelfde manier worden toegekend – zie hierboven.

unordered_map Capaciteit

size_type size() const nobehalve
Retourneert het aantal paren op de kaart.

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

umap['banaan'] = 'geel';
umap['druif'] = 'groente';
umap['vijg'] = 'paars';

kosten<<umap.maat() <<'N';

Uitgang is 3.

bool leeg() const nobehalve

Retourneert 1 voor waar als de kaart geen paar heeft, en 0 voor onwaar als er paren zijn. Voorbeeld:

unordered_map<const char*, const char*>umap;
kosten<<umap.leeg() <<'N';

Uitgang is 1.

Terugkerende iterators en de klasse ongeordende kaart

Een iterator is als een aanwijzer, maar heeft meer functionaliteit dan de aanwijzer.

begin() noexcept

Retourneert een iterator die verwijst naar het eerste paar van het kaartobject, zoals in het volgende codesegment:

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

umap['banaan'] = 'geel';umap['druif'] = 'groente';umap['vijg'] = 'paars';

unordered_map<const char*, const char*> ::iteratoriter=umap.beginnen();
paar-<const char*, const char*>pr= *iter;
kosten<<pr.eerst << ',' <<pr.tweede << 'N';

De output is: vijg, paars. De kaart is ongeordend.

begin() const nobehalve;

Retourneert een iterator die verwijst naar het eerste element van de verzameling kaartobjecten. Wanneer de objectconstructie wordt voorafgegaan door const, wordt de expressie begin() const uitgevoerd in plaats van begin(). Onder deze voorwaarde kunnen de elementen in het object niet worden gewijzigd. Het wordt bijvoorbeeld gebruikt in de volgende code.

constunordered_map<const char*, const char*>umap({{'banaan', 'geel'},
{'druif', 'groente'}, {'vijg', 'paars'}});

unordered_map<const char*, const char*> ::const_iteratoriter=umap.beginnen();
paar-<const char*, const char*>pr= *iter;
kosten<<pr.eerst << ',' <<pr.tweede << 'N';

De output is: vijg, paars. De kaart is ongeordend. Merk op dat const_iterator deze keer is gebruikt, in plaats van alleen iterator, om de geretourneerde iterator te ontvangen.

end() neebehalve

Retourneert een iterator die direct voorbij het laatste element van het kaartobject wijst.

end() const nobehalve

Retourneert een iterator die direct voorbij het laatste element van het kaartobject wijst. Wanneer de constructie van het kaartobject wordt voorafgegaan door const, wordt de expressie end() const uitgevoerd in plaats van end().

unordered_map Operaties

iterator vinden (const key_type & k)

Zoekt naar een paar van de gegeven sleutel op de kaart. Als het wordt gevonden, retourneert het de iterator. Als het niet wordt gevonden, retourneert het een iterator die naar het einde van de kaart wijst, wat geen paar is. De volgende code laat zien hoe u deze lidfunctie kunt gebruiken:

unordered_map<char,char>umap;

umap['tot'] = 'B';umap['C'] = 'NS';umap['En'] = 'F';

unordered_map<char,char> ::iteratoriter=umap.vind('C');
indien (umap.vind('C') ! =umap.einde())
{
paar-<char,char>pr= *iter;
kosten<<pr.eerst << ',' <<pr.tweede << 'N';
}

De uitvoer is: c, d

const_iterator find(const key_type& k) const;

Deze versie van de functie wordt aangeroepen als het maken van de ongeordende kaart begint met const, waardoor alle elementen van de kaart alleen-lezen zijn.

unordered_map Modifiers

paar invoegen (value_type&& obj)
Een ongeordende kaart betekent dat de paren niet in een willekeurige volgorde staan. Het programma voegt het paar dus in op elke plaats die het handig vindt. De functie retourneert, paar. Als de invoeging succesvol was, is bool 1 voor waar, anders zou het 0 zijn voor onwaar. Als het invoegen is gelukt, wijst de iterator naar het nieuw ingevoegde element. De volgende code illustreert het gebruik:

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

umap['banaan'] = 'geel';
umap['druif'] = 'groente';
umap['vijg'] = 'paars';

umap.invoegen({{'kers', 'netto'}, {'aardbei', 'netto'}});

kosten<<umap.maat() << 'N';

De output is: 5. Er kan meer dan één paar worden ingevoegd.

size_type wissen (const key_type & k)

Deze functie wist een paar uit de unordered_map. Het volgende codesegment illustreert:

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

umap['banaan'] = 'geel';
umap['druif'] = 'groente';
umap['vijg'] = 'paars';

intop een=umap.wissen('druif');

kosten<<umap.maat() << 'N';

Uitgang is 2.
void swap(unordered_map&)
Twee ongeordende kaarten kunnen worden verwisseld, zoals geïllustreerd in dit codesegment:

unordered_map<const char*, const char*>umap1= {{'banaan', 'geel'},
{'druif', 'groente'}, {'vijg', 'paars'}, {'aardbei', 'netto'}};

unordered_map<const char*, const char*>umap2= {{'kers', 'netto'}, {'limoen', 'groente'}};

umap1.ruil(umap2);

unordered_map<const char*, const char*> ::iteratoriter1=umap1.beginnen();
paar-<const char*, const char*>pr1= *iter1;
unordered_map<const char*, const char*> ::iteratoriter2=umap2.beginnen();
paar-<const char*, const char*>pr2= *iter2;

kosten<< 'Eerste sleutel en grootte van umap1: '<<pr1.eerst <<','<<umap1.maat() << 'N';
kosten<< 'Eerste sleutel en grootte van umap2'<<pr2.eerst <<','<<umap2.maat() << 'N';
unordered_map<const char*, const char*>umap1= {{'banaan', 'geel'},
{'druif', 'groente'}, {'vijg', 'paars'}, {'aardbei', 'netto'}};
unordered_map<const char*, const char*>umap2= {{'kers', 'netto'}, {'limoen', 'groente'}};

umap1.ruil(umap2);

unordered_map<const char*, const char*> ::iteratoriter1=umap1.beginnen();
paar-<const char*, const char*>pr1= *iter1;
unordered_map<const char*, const char*> ::iteratoriter2=umap2.beginnen();
paar-<const char*, const char*>pr2= *iter2;

kosten<< 'Eerste sleutel en grootte van umap1: '<<pr1.eerst <<','<<umap1.maat() << 'N';
kosten<< 'Eerste sleutel en grootte van umap2'<<pr2.eerst <<','<<umap2.maat() << 'N';

De uitvoer is:

Eerste sleutel en grootte van umap1: limoen, 2

Eerste sleutel en grootte van umap2 aardbei, 4

De kaart is ongeordend. Merk op dat de lengte van een kaart indien nodig wordt vergroot. De gegevenstypen moeten hetzelfde zijn.

Klasse en zijn geïnstantieerde objecten

Een waarde is voor een gegevenstype, zoals een geïnstantieerd object voor een klasse is. De ongeordende kaartconstructie kan ook een klasse als datatype accepteren. Het volgende programma illustreert dit:

#erbij betrekken
#erbij betrekken
namespace std; gebruiken;

klasse TheCla
{
openbaar:
intop een;
statisch charch;

leegtefunctie(charNee, const char *P)
{
kosten<< 'Er zijn ' <<op een<< 'boeken waard' <<Nee<<P<< ' in de winkel.' << 'N';
}
statisch leegteplezier(charch)
{
indien (ch== 'tot')
kosten<< 'Officiële statische ledenfunctie' << 'N';
}
};

inthoofd()
{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

unordered_map<const char*,De Cla>umap;
umap= {{'banaan',obj1}, {'druif',obj2}, {'vijg',obj3}, {'aardbei',obj4}, {'limoen',obj5}};

kosten<<umap.maat() << 'N';

opbrengst 0;
}

De uitvoer is: 5.

De klassedefinitie heeft twee openbare gegevensleden en twee openbare lidfuncties. In de functie main() worden verschillende objecten voor de klasse geïnstantieerd. Een ongeordende kaart wordt vervolgens geïnstantieerd, waarbij elk paar bestaat uit de naam van een vrucht en een object uit de klasse. De grootte van de kaart wordt weergegeven. Het programma compileert zonder waarschuwing of foutmelding.

Toepassing van de kaart

De array koppelt een index aan een waarde. Sleutel/waarde-paren bestaan ​​in veel situaties in het leven, die kunnen worden geprogrammeerd. Het sleutel/waarde-paar fruit/kleur is slechts één voorbeeld. Een ander voorbeeld is de naam van mensen en hun leeftijden. In dit geval zal het paar van het type paar zijn. Het kan ook een paar zijn. In het laatste geval zal de voorbewerkingsrichtlijn worden toegepast. Een sleutel/waarde-paar kunnen nog steeds de namen zijn van echtparen. In landen waar polygamie heerst, zullen er verschillende vrouwen zijn voor één man.

Vorming van een kaart

Een kaart is geen tweedimensionale array met twee kolommen. Een kaart werkt met een hashfunctie. De sleutel wordt gecodeerd door de hash-functie, in een geheel getal van een array. Het is deze array die de waarden bevat. Er is dus eigenlijk één array met de waarden, en sleutels worden toegewezen aan de indices van de array, en dus worden de overeenkomsten tussen sleutels en waarden gemaakt. Hashing is een uitgebreid onderwerp en wordt niet behandeld in dit artikel.

Conclusie

Een kaart, ook wel een associatieve array genoemd, is een lijst met elementen, waarbij elk element een sleutel/waarde-paar is. Elke sleutel komt dus overeen met een waarde. In C++ is de kaart geïmplementeerd als een gegevensstructuur met lidfuncties en operators. Een geordende kaart is er een waar de elementparen zijn geordend op sleutels. Een ongeordende kaart is er een waar geen volgorde is.

Technisch gezien bestaat een hash uit paarelementen. In feite is het paar een hele gegevensstructuur met zijn lidfuncties en operators. De twee sjabloonparameters voor het paar zijn dezelfde twee sjabloonparameters voor de unordered_map.

De initializer_list voor de kaart is een letterlijke array van letterlijke waarden. Elke interne letterlijke bestaat uit twee objecten, het sleutel/waarde-paar.

De lidfuncties en operators voor unordered_map kunnen worden gecategoriseerd onder de volgende kopjes: unordered_map construction/copy construction, unordered_map Capacity, unordered_map iterator, unordered_map Operations en unordered_map Modifiers.

Een ongeordende kaart wordt gebruikt wanneer een sleutel moet worden toegewezen aan een waarde.

Chrys