C ++

Sådan bruges C ++ Unordered Map

Sådan bruges C ++ Unordered Map
Et kort, også kendt som et associerende array, er en liste over elementer, hvor hvert element er et nøgle / værdipar. Så hver nøgle svarer til en værdi. Forskellige nøgler kan have samme værdi til almindeligt arbejde. For eksempel kan tasterne være en liste over frugter og de tilsvarende værdier, frugternes farver. I C ++ implementeres kortet som en datastruktur med medlemsfunktioner og operatører. Et ordnet kort er et, hvor elementparrene er ordnet efter nøgler. Et uordnet kort er et, hvor der ikke er nogen ordre. Denne artikel forklarer, hvordan man bruger C ++ ikke-ordnet kort, skrevet som unordered_map. Du har brug for viden i C ++ - markører for at forstå denne artikel. unordered_map er en del af C ++ standardbiblioteket.

Klasse og objekter

En klasse er et sæt variabler og funktioner, der fungerer sammen, hvor variablerne ikke har værdier tildelt. Når værdier tildeles variablerne, bliver klassen et objekt. Forskellige værdier givet til samme klasse resulterer i forskellige objekter; det vil sige, at forskellige objekter er den samme klasse med forskellige værdier. Oprettelse af et objekt fra en klasse siges at instantere objektet.

Navnet unordered_map er en klasse. Et objekt oprettet fra klassen unordered_map har et programmørvalgt navn.

En funktion, der hører til en klasse, er nødvendig for at instantiere et objekt fra klassen. I C ++ har denne funktion det samme navn som navnet på klassen. Objekter oprettet (instantieret) fra klassen har forskellige navne givet af programmøren.

At skabe et objekt fra klassen betyder at konstruere objektet; det betyder også instantiating.

Et C ++ - program, der bruger klassen unordered_map, starter med følgende linjer øverst i filen:

#omfatte
#omfatte
ved hjælp af namespace std;

Den første linje er til input / output. Den anden linje er at give programmet mulighed for at bruge alle funktionerne i klassen unordered_map. Den tredje linje giver programmet mulighed for at bruge navnene i standardnavneområdet.

Overbelastning af en funktion

Når to eller flere forskellige funktionssignaturer har samme navn, siges dette navn at være overbelastet. Når en funktion kaldes, bestemmer antallet og typen af ​​argumenter, hvilken funktion der faktisk udføres.

Konstruktion / kopi konstruktion

Enkel konstruktion

Et uordnet kort kan konstrueres og tildeles værdier som følger:

unordered_map umap;
umap ["banan"] = "gul";
umap ["drue"] = "grøn";
umap ["fig"] = "lilla";

Erklæringen begynder med skabelonspecialisering med typerne for nøgle- og værdiparene. Dette efterfølges af programmørens valgte navn til kortet; derefter et semikolon. Det andet kodesegment viser, hvordan man tildeler værdier til deres nøgler.
Konstruktion af Initializer_list
Dette kan gøres som følger:

unordered_map umap ("banan", "gul",
"drue", "grøn", "fig", "lilla");

Konstruktion ved at tildele Initializer_list
Eksempel:

unordered_map umap = "banan", "gul",
"drue", "grøn", "fig", "lilla";

Konstruktion ved at kopiere en anden unordered_map
Eksempel:

unordered_map umap1 ("banan", "gul",
"drue", "grøn", "fig", "lilla");
unordered_map umap2 (umap1);

Parret Element

Følgende kode viser, hvordan du opretter og får adgang til parelementet:

par pr = 'd', "hav";
cout << pr.first << '\n';
cout << pr.second << '\n';

Outputtet er:

d
hav

første og andet er reserverede ord til de to ting i parret. Værdierne i parret kan stadig ændres ved hjælp af første og andet.

Et par kaldes værdi_type i emnet på det ikke-ordnede kort.

unordered_map Elementadgang

mapped_type & operator [] (key_type && k)
Returnerer værdien for den tilsvarende tast. Eksempel:

unordered_map umap;
umap ["banan"] = "gul";
umap ["drue"] = "grøn";
umap ["fig"] = "lilla";
const char * ret = umap ["drue"];
cout << ret <<'\n';

Outputtet er: “grøn”. Værdier kan tildeles på samme måde - se ovenfor.

unordered_map Kapacitet

størrelse_type størrelse () const noexcept
Returnerer antallet af par på kortet.

unordered_map umap;
umap ["banan"] = "gul";
umap ["drue"] = "grøn";
umap ["fig"] = "lilla";
cout << umap.size() <<'\n';

Output er 3.

bool tom () const noexcept

Returnerer 1 for sand, hvis kortet ikke har noget par, og 0 for falsk, hvis det har par. Eksempel:

unordered_map umap;
cout << umap.empty() <<'\n';

Output er 1.

Tilbagevendende itteratorer og den uordnede kortklasse

En iterator er som en markør, men har mere funktionalitet end markøren.

start () noexcept

Returnerer en iterator, der peger på det første par af kortobjektet, som i følgende kodesegment:

unordered_map umap;
umap ["banan"] = "gul"; umap ["drue"] = "grøn"; umap ["fig"] = "lilla";
unordered_map:: iterator iter = umap.begynde();
par pr = * iter;
cout << pr.first << ", " << pr.second << '\n';

Outputtet er: fig, lilla. Kortet er ikke ordnet.

start () const noexcept;

Returnerer en iterator, der peger på det første element i kortobjektindsamlingen. Når objektkonstruktionen er forud for const, udføres udtrykket "start () const" i stedet for "start ()". Under denne betingelse kan elementerne i objektet ikke ændres. Det bruges f.eks. I følgende kode.

const unordered_map umap ("banan", "gul",
"drue", "grøn", "fig", "lilla");
unordered_map:: const_iterator iter = umap.begynde();
par pr = * iter;
cout << pr.first << ", " << pr.second << '\n';

Outputtet er: fig, lilla. Kortet er ikke ordnet. Bemærk, at const_iterator er blevet brugt denne gang i stedet for kun iterator til at modtage den returnerede iterator.

slut () noexcept

Returnerer en iterator, der peger umiddelbart ud over det sidste element i kortobjektet.

end () const noexcept

Returnerer en iterator, der peger umiddelbart ud over det sidste element i kortobjektet. Når kortobjektkonstruktionen er forud for const, udføres udtrykket "end () const" i stedet for "end ()".

unordered_map-operationer

iterator find (const key_type & k)

Søger efter et par af den givne nøgle på kortet. Hvis den findes, returnerer den iteratoren. Hvis den ikke findes, returnerer den en iterator, der peger på slutningen af ​​kortet, som ikke er et par. Følgende kode viser, hvordan du bruger denne medlemsfunktion:

unordered_map umap;
umap ['a'] = 'b'; umap ['c'] = 'd'; umap ['e'] = 'f';
unordered_map:: iterator iter = umap.find ('c');
hvis (umap.find ('c') != umap.ende())

par pr = * iter;
cout << pr.first << ", " << pr.second << '\n';

Outputtet er: c, d

const_iterator find (const key_type & k) const;

Denne version af funktionen kaldes, hvis oprettelsen af ​​det ikke-ordnede kort begynder med const, hvilket gør alle elementerne på kortet skrivebeskyttet.

unordered_map Modifiers

par indsæt (værdi_type && obj)
Et uordnet kort betyder, at parene ikke er i nogen rækkefølge. Så programmet indsætter parret på ethvert sted, det finder praktisk. Funktionen vender tilbage, par. Hvis indsættelsen var vellykket, vil bool være 1 for sandt, ellers ville det være 0 for falsk. Hvis indsættelsen er vellykket, peger iteratoren på det nyindsatte element. Følgende kode illustrerer brugen:

unordered_map umap;
umap ["banan"] = "gul";
umap ["drue"] = "grøn";
umap ["fig"] = "lilla";
umap.indsæt ("kirsebær", "rød", "jordbær", "rød");
cout << umap.size() << '\n';

Outputtet er: 5. Mere end et par kan indsættes.

størrelse_type sletning (const key_type & k)

Denne funktion sletter et par fra unordered_map. Følgende kodesegment illustrerer:

unordered_map umap;
umap ["banan"] = "gul";
umap ["drue"] = "grøn";
umap ["fig"] = "lilla";
int num = umap.sletning ("drue");
cout << umap.size() << '\n';

Output er 2.
ugyldig swap (unordered_map &)
To uordnede kort kan byttes som illustreret i dette kodesegment:

unordered_map umap1 = "banan", "gul",
"drue", "grøn", "fig", "lilla", "jordbær", "rød";
unordered_map umap2 = "kirsebær", "rød", "kalk", "grøn";
umap1.bytte (umap2);
unordered_map:: iterator iter1 = umap1.begynde();
par pr1 = * iter1;
unordered_map:: iterator iter2 = umap2.begynde();
par 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 = "banan", "gul",
"drue", "grøn", "fig", "lilla", "jordbær", "rød";
unordered_map umap2 = "kirsebær", "rød", "kalk", "grøn";
umap1.bytte (umap2);
unordered_map:: iterator iter1 = umap1.begynde();
par pr1 = * iter1;
unordered_map:: iterator iter2 = umap2.begynde();
par 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';

Outputtet er:

Første nøgle og størrelse på umap1: kalk, 2

Første nøgle og størrelse på umap2 jordbær, 4

Kortet er ikke ordnet. Bemærk, at længden af ​​et kort øges, hvis det er nødvendigt. Datatyperne skal være de samme.

Klassen og dens øjeblikkelige genstande

En værdi er til en datatype, som et instantieret objekt er for en klasse. Den uordnede kortkonstruktion kan også acceptere en klasse som datatype. Følgende program illustrerer dette:

#omfatte
#omfatte
ved hjælp af namespace std;
klasse TheCla

offentlig:
int num;
statisk char ch;
ugyldig funk (char cha, const char * str)

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

statisk tomrums sjov (char ch)

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

;
int main ()

TheCla mod1; TheCla obj2; TheCla obj3; TheCla obj4; TheCla obj5;
unordered_map umap;
umap = "banan", obj1, "drue", obj2, "fig", obj3, "jordbær", obj4, "lime", obj5;
cout << umap.size() << '\n';
returnere 0;

Outputtet er: 5.

Klassedefinitionen har to data offentlige medlemmer og to offentlige medlems funktioner. I hovedfunktionen () instantieres forskellige objekter til klassen. Derefter instantieres et ikke-ordnet kort, hvor hvert par består af navnet på en frugt og et objekt fra klassen. Kortets størrelse vises. Programmet kompileres uden advarsel eller fejlmeddelelse.

Anvendelse af kortet

Arrayet knytter et indeks til værdien. Nøgle / værdipar findes i mange situationer i livet, som kan programmeres. Nøgle / værdi par af frugt / farve er blot et eksempel. Et andet eksempel er navnet på mennesker og deres alder. I dette tilfælde vil parret være af en type, par. Det kan også være par. I sidstnævnte tilfælde vil forbehandlingsdirektivet blive anvendt. Et nøgle / værdipar kan stadig være navnene på ægtepar. I lande, hvor der er polygami, vil der være forskellige koner til en mand.

Dannelse af et kort

Et kort er ikke et todimensionelt array med to kolonner. Et kort fungerer med en hash-funktion. Nøglen er kodet af hash-funktionen til et heltal i en matrix. Det er denne matrix, der indeholder værdierne. Så der er faktisk et array med værdierne, og nøglerne kortlægges til arrayets indekser, og korrespondancerne mellem nøgler og værdier foretages. Hashing er et omfattende emne og er ikke dækket af denne artikel.

Konklusion

Et kort, også kendt som et associerende array, er en liste over elementer, hvor hvert element er et nøgle / værdipar. Så hver nøgle svarer til en værdi. I C ++ implementeres kortet som en datastruktur med medlemsfunktioner og operatører. Et ordnet kort er et, hvor elementparrene er ordnet efter nøgler. Et uordnet kort er et, hvor der ikke er nogen ordre.

Teknisk set består en hash af par elementer. Faktisk er parret en hel datastruktur med dets medlemsfunktioner og operatører. De to skabelonparametre for parret er de samme to skabelonparametre for unordered_map.

Initialiseringslisten for kortet er en matrix bogstavelig med bogstaver. Hver indre bogstavelig består af to objekter, nøgle / værdipar.

Medlemsfunktionerne og operatorerne til unordered_map kan kategoriseres under følgende overskrifter: unordered_map-konstruktion / kopi-konstruktion, unordered_map Capacity, unordered_map iterator, unordered_map Operations og unordered_map Modifiers.

Et uordnet kort bruges, når en nøgle skal kortlægges til en værdi.

Chrys

Open Source-porte med kommercielle spilmotorer
Gratis, open source og cross-platform spilmotorgendringer kan bruges til at spille gamle såvel som nogle af de temmelig nylige spiltitler. Denne artik...
Bedste kommandoliniespil til Linux
Kommandolinjen er ikke kun din største allierede, når du bruger Linux, den kan også være kilde til underholdning, fordi du kan bruge den til at spille...
Bedste apps til Gamepad Mapping til Linux
Hvis du kan lide at spille spil på Linux med en gamepad i stedet for et typisk tastatur- og musesystem, er der nogle nyttige apps til dig. Mange pc-sp...