C++

Hoe C++ ongeordende kaart te gebruiken

Hoe C++ ongeordende kaart te gebruiken
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 fruit 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 op sleutels zijn geordend. Een ongeordende kaart is er een waar geen orde is. Dit artikel legt uit hoe je C++ ongeordende kaart gebruikt, geschreven als unordered_map. U hebt kennis van C++-aanwijzingen 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 van een klasse zou het object instantiëren.

De naam, unordered_map, is een klasse. Een object gemaakt 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 zijn gemaakt (geïnstantieerd) uit de klasse 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:

#include
#include
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 standaard naamruimte 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 umap;
umap["banaan"] = "geel";
umap["druif"] = "groen";
umap["fig"] = "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 u waarden aan hun sleutels kunt toewijzen.
Constructie door Initializer_list
Dit kan als volgt:

unordered_map umap ("banaan", "geel",
"druif", "groen", "vijg", "paars");

Constructie door Initializer_list toe te wijzen
Voorbeeld:

unordered_map umap = "banaan", "geel",
"druif", "groen", "vijg", "paars";

Constructie door een andere ongeordende_map te kopiëren
Voorbeeld:

unordered_map umap1 ("banaan", "geel",
"druif", "groen", "vijg", "paars");
unordered_map umap2 (umap1);

Het paar Element

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

paar- pr = 'd', "zee";
cout << pr.first << '\n';
cout << pr.second << '\n';

De uitvoer is:

d
zee

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 genoemd, value_type in het onderwerp van de ongeordende kaart.

unordered_map Elementtoegang

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

unordered_map umap;
umap["banaan"] = "geel";
umap["druif"] = "groen";
umap["fig"] = "paars";
const char *ret = umap["druif"];
cout << ret <<'\n';

De output is: “groen”. Waarden kunnen op dezelfde manier worden toegewezen - zie hierboven.

unordered_map Capaciteit

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

unordered_map umap;
umap["banaan"] = "geel";
umap["druif"] = "groen";
umap["fig"] = "paars";
cout << umap.size() <<'\n';

Uitgang is 3.

bool leeg() const nobehalve

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

unordered_map umap;
cout << umap.empty() <<'\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() neebehalve

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

unordered_map umap;
umap["banaan"] = "geel"; umap["druif"] = "groen"; umap["fig"] = "paars";
unordered_map::iterator iter = umap.beginnen();
paar- pr = *iter;
cout << pr.first << ", " << pr.second << '\n';

De output is: vijg, paars. De kaart is niet geordend.

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 uitdrukking "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:.

const unordered_map umap ("banaan", "geel",
"druif", "groen", "vijg", "paars");
unordered_map::const_iterator iter = umap.beginnen();
paar- pr = *iter;
cout << pr.first << ", " << pr.second << '\n';

De output is: vijg, paars. De kaart is niet geordend. 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 uitdrukking "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 umap;
umap['a'] = 'b'; umap['c'] = 'd'; umap['e'] = 'f';
unordered_map::iterator iter = umap.vind('c');
als (umap.vind('c') != umap.einde())

paar- pr = *iter;
cout << pr.first << ", " << pr.second << '\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- insert(value_type&& obj)
Een ongeordende kaart betekent dat de paren niet in een willekeurige volgorde staan. Dus het programma voegt het paar 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 umap;
umap["banaan"] = "geel";
umap["druif"] = "groen";
umap["fig"] = "paars";
umap.insert("kers", "rood", "aardbei", "rood");
cout << umap.size() << '\n';

De uitvoer 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 umap;
umap["banaan"] = "geel";
umap["druif"] = "groen";
umap["fig"] = "paars";
int num = umap.wissen("druif");
cout << umap.size() << '\n';

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

unordered_map umap1 = "banaan", "geel",
"druif", "groen", "vijg", "paars", "aardbei", "rood";
unordered_map umap2 = "kers", "rood", "limoen", "groen";
umap1.swap(umap2);
unordered_map::iterator iter1 = umap1.beginnen();
paar- pr1 = *iter1;
unordered_map::iterator iter2 = umap2.beginnen();
paar- pr2 = *iter2;
cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';
unordered_map umap1 = "banaan", "geel",
"druif", "groen", "vijg", "paars", "aardbei", "rood";
unordered_map umap2 = "kers", "rood", "limoen", "groen";
umap1.swap(umap2);
unordered_map::iterator iter1 = umap1.beginnen();
paar- pr1 = *iter1;
unordered_map::iterator iter2 = umap2.beginnen();
paar- pr2 = *iter2;
cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';

De uitvoer is:

Eerste sleutel en grootte van umap1: limoen, 2

Eerste sleutel en grootte van umap2 aardbei, 4

De kaart is niet geordend. 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 gegevenstype accepteren. Het volgende programma illustreert dit:

#include
#include
namespace std; gebruiken;
klasse TheCla

openbaar:
int. aantal;
statisch teken;
void func (char cha, const char *str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

statische leegte plezier (char ch)

als (ch == 'a')
cout << "Official static member function" << '\n';

;
int hoofd()

DeCla obj1; DeCla obj2; DeCla obj3; DeCla obj4; DeCla obj5;
unordered_map umap;
umap = "banaan", obj1, "druif", obj2, "vijg", obj3, "aardbei", obj4, "limoen", obj5;
cout << umap.size() << '\n';
retourneer 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. Er wordt dan een ongeordende kaart gemaakt, waarbij elk paar bestaat uit de naam van een vrucht en een object uit de klasse the. De grootte van de kaart wordt weergegeven. Het programma compileert zonder waarschuwing of foutmelding.

Toepassing van de kaart

De array koppelt een index aan 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 is het paar van het type, paar. Het kan ook een paar zijn. In het laatste geval zal de pre-processing richtlijn 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 hash-functie. 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 op sleutels zijn geordend. Een ongeordende kaart is er een waar geen volgorde is.

Technisch gezien bestaat een hash uit een paar elementen. 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

De scrollrichting van de muis en touchpads omkeren in Windows 10
Muis en Touchpads maken computergebruik niet alleen eenvoudig, maar ook efficiënter en minder tijdrovend. We kunnen ons een leven zonder deze apparate...
Hoe de muisaanwijzer en cursorgrootte, kleur en schema op Windows 10 te veranderen
De muisaanwijzer en cursor in Windows 10 zijn zeer belangrijke aspecten van het besturingssysteem. Dit geldt ook voor andere besturingssystemen, dus i...
Gratis en open source game-engines voor het ontwikkelen van Linux-games
Dit artikel behandelt een lijst met gratis en open source game-engines die kunnen worden gebruikt voor het ontwikkelen van 2D- en 3D-games op Linux. E...