C ++

Hur man använder C ++ Unordered Map

Hur man använder C ++ Unordered Map
En karta, även känd som en associerande matris, är en lista med element där varje element är ett nyckel / värdepar. Så varje tangent motsvarar ett värde. Olika tangenter kan ha samma värde för vanligt arbete. Tangenterna kan till exempel vara en lista med frukter och motsvarande värden, fruktens färger. I C ++ implementeras kartan som en datastruktur med medlemsfunktioner och operatörer. En ordnad karta är en där elementparen har ordnats med nycklar. En oordnad karta är en där det inte finns någon ordning. Den här artikeln förklarar hur man använder C ++ oordnad karta, skriven som unordered_map. Du behöver kunskap i C ++ - pekare för att förstå den här artikeln. unordered_map är en del av C ++ - standardbiblioteket.

Klass och objekt

En klass är en uppsättning variabler och funktioner som fungerar tillsammans, där variablerna inte har värden tilldelade. När värden tilldelas variablerna blir klassen ett objekt. Olika värden som ges till samma klass resulterar i olika objekt; det vill säga olika objekt är samma klass med olika värden. Att skapa ett objekt från en klass sägs att det skapar ett objekt.

Namnet, unordered_map, är en klass. Ett objekt som skapats från unordered_map-klassen har ett programmerat valt namn.

En funktion som tillhör en klass behövs för att instantiera ett objekt från klassen. I C ++ har den funktionen samma namn som namnet på klassen. Objekt som skapats (instantierats) från klassen har olika namn som de har fått av programmeraren.

Att skapa ett objekt från klassen betyder att konstruera objektet; det betyder också omedelbar inställning.

Ett C ++ - program som använder klassen unordered_map börjar med följande rader högst upp i filen:

#omfatta
#omfatta
använder namnrymd std;

Den första raden är för in / ut. Den andra raden är att låta programmet använda alla funktioner i klassen unordered_map. Den tredje raden tillåter programmet att använda namnen i standardnamnområdet.

Överbelastning av en funktion

När två eller flera olika funktionssignaturer har samma namn, sägs det namnet vara överbelastat. När en funktion anropas bestämmer antalet och typen av argument vilken funktion som faktiskt körs.

Konstruktion / kopieringskonstruktion

Enkel konstruktion

En oordnad karta kan konstrueras och tilldelas värden enligt följande:

unordered_map umap;
umap ["banan"] = "gul";
umap ["druva"] = "grön";
umap ["fig"] = "lila";

Deklarationen börjar med mallspecialiseringen med typerna för nyckel- och värdeparen. Detta följs av programmerarens valda namn för kartan; sedan ett semikolon. Det andra kodsegmentet visar hur man tilldelar värden till sina nycklar.
Konstruktion av Initializer_list
Detta kan göras enligt följande:

unordered_map umap ("banan", "gul",
"druva", "grön", "fig", "lila");

Konstruktion genom att tilldela Initializer_list
Exempel:

unordered_map umap = "banan", "gul",
"druva", "grön", "fig", "lila";

Konstruktion genom att kopiera en annan unordered_map
Exempel:

unordered_map umap1 ("banan", "gul",
"druva", "grön", "fig", "lila");
unordered_map umap2 (umap1);

Paret Element

Följande kod visar hur du skapar och får åtkomst till parelementet:

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

Utgången är:

d
hav

första och andra är reserverade ord för de två objekten i paret. Värdena i paret kan ändras med hjälp av första och andra.

Ett par kallas, value_type i ämnet för den oordnade kartan.

unordered_map Element Access

mapped_type & operator [] (key_type && k)
Returnerar värdet för motsvarande tangent. Exempel:

unordered_map umap;
umap ["banan"] = "gul";
umap ["druva"] = "grön";
umap ["fig"] = "lila";
const char * ret = umap ["druva"];
cout << ret <<'\n';

Utgången är: “grön”. Värden kan tilldelas på samma sätt - se ovan.

unordered_map Kapacitet

size_type storlek () const noexcept
Returnerar antalet par på kartan.

unordered_map umap;
umap ["banan"] = "gul";
umap ["druva"] = "grön";
umap ["fig"] = "lila";
cout << umap.size() <<'\n';

Output är 3.

bool tom () const noexcept

Returnerar 1 för true om kartan inte har något par och 0 för false om den har par. Exempel:

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

Output är 1.

Återkommande Iteratorer och den oordnade kartklassen

En iterator är som en pekare men har mer funktionalitet än pekaren.

starta () noexcept

Returnerar en iterator som pekar på det första paret i kartobjektet, som i följande kodsegment:

unordered_map umap;
umap ["banan"] = "gul"; umap ["druva"] = "grön"; umap ["fig"] = "lila";
unordered_map:: iterator iter = umap.Börja();
par pr = * iter;
cout << pr.first << ", " << pr.second << '\n';

Utgången är: fig, lila. Kartan är obeställd.

begin () const noexcept;

Returnerar en iterator som pekar på det första elementet i kartobjektsamlingen. När objektkonstruktionen föregås av const utförs uttrycket "start () const" istället för "start ()". Under detta villkor kan elementen i objektet inte ändras. Den används till exempel i följande kod.

const unordered_map umap ("banan", "gul",
"druva", "grön", "fig", "lila");
unordered_map:: const_iterator iter = umap.Börja();
par pr = * iter;
cout << pr.first << ", " << pr.second << '\n';

Utgången är: fig, lila. Kartan är obeställd. Observera att const_iterator har använts den här gången, istället för bara iterator, för att ta emot den returnerade iteratorn.

slut () noexcept

Returnerar en iterator som pekar direkt bortom det sista elementet i kartobjektet.

end () const noexcept

Returnerar en iterator som pekar omedelbart bortom det sista elementet i kartobjektet. När kartobjektkonstruktionen föregås av const körs uttrycket "end () const" istället för "end ()".

unordered_map-operationer

iteratorsökning (const key_type & k)

Söker efter ett par av den angivna nyckeln på kartan. Om den hittas returnerar den iteratorn. Om den inte hittas returnerar den en iterator som pekar på slutet av kartan, som inte är ett par. Följande kod visar hur du använder den här medlemsfunktionen:

unordered_map umap;
umap ['a'] = 'b'; umap ['c'] = 'd'; umap ['e'] = 'f';
unordered_map:: iterator iter = umap.hitta ('c');
if (umap.hitta ('c') != umap.slutet())

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

Utgången är: c, d

const_iterator hitta (const key_type & k) const;

Denna version av funktionen kallas, om skapandet av den oordnade kartan börjar med const, vilket gör att alla element på kartan är skrivskyddade.

unordered_map Modifiers

par infoga (value_type && obj)
En oordnad karta betyder att paren inte är i någon ordning. Så, programmet sätter in paret på vilken plats som helst som det passar. Funktionen återgår, parar ihop. Om infogningen lyckades kommer bool att vara 1 för sant, annars skulle det vara 0 för falskt. Om insättningen lyckas pekar iteratorn på det nyligen infogade elementet. Följande kod illustrerar användningen:

unordered_map umap;
umap ["banan"] = "gul";
umap ["druva"] = "grön";
umap ["fig"] = "lila";
umap.infoga ("körsbär", "röd", "jordgubbe", "röd");
cout << umap.size() << '\n';

Utgången är: 5. Mer än ett par kan sättas in.

size_type radera (const key_type & k)

Denna funktion raderar ett par från unordered_map. Följande kodsegment illustrerar:

unordered_map umap;
umap ["banan"] = "gul";
umap ["druva"] = "grön";
umap ["fig"] = "lila";
int num = umap.radera ("druva");
cout << umap.size() << '\n';

Utgången är 2.
ogiltig swap (unordered_map &)
Två oordnade kartor kan bytas ut, som illustreras i detta kodsegment:

unordered_map umap1 = "banan", "gul",
"druva", "grön", "fig", "lila", "jordgubbe", "röd";
unordered_map umap2 = "körsbär", "röd", "lime", "grön";
umap1.byta (umap2);
unordered_map:: iterator iter1 = umap1.Börja();
par pr1 = * iter1;
unordered_map:: iterator iter2 = umap2.Börja();
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",
"druva", "grön", "fig", "lila", "jordgubbe", "röd";
unordered_map umap2 = "körsbär", "röd", "lime", "grön";
umap1.swap (umap2);
unordered_map:: iterator iter1 = umap1.Börja();
par pr1 = * iter1;
unordered_map:: iterator iter2 = umap2.Börja();
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';

Utgången är:

Första nyckeln och storleken på umap1: lime, 2

Första nyckeln och storleken på umap2 jordgubbe, 4

Kartan är obeställd. Observera att kartans längd ökas vid behov. Datatyperna måste vara desamma.

Klass och dess omedelbara objekt

Ett värde är till en datatyp, som ett instanserat objekt till en klass. Den oordnade kartkonstruktionen kan också acceptera en klass som datatyp. Följande program illustrerar detta:

#omfatta
#omfatta
använder namnrymd std;
klass TheCla

offentlig:
int num;
statisk char ch;
void func (char cha, const char * str)

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

statisk tomrumskul (char ch)

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

;
int main ()

TheCla obj1; TheCla obj2; TheCla obj3; TheCla obj4; TheCla obj5;
unordered_map umap;
umap = "banana", obj1, "grape", obj2, "fig", obj3, "strawberry", obj4, "lime", obj5;
cout << umap.size() << '\n';
returnera 0;

Utgången är: 5.

Klassdefinitionen har två datapublicerade medlemmar och två offentliga medlemsfunktioner. I huvudfunktionen () instilleras olika objekt för klassen. En oordnad karta instanseras sedan, där varje par består av namnet på en frukt och ett objekt från klassen. Kartans storlek visas. Programmet kompilerar utan varning eller felmeddelande.

Tillämpning av kartan

Matrisen associerar ett index till värdet. Nyckel / värdepar finns i många situationer i livet, som kan programmeras. Nyckel / värde-par frukt / färg är bara ett exempel. Ett annat exempel är namnet på människor och deras åldrar. I det här fallet kommer paret att vara av en typ, par. Det kan också vara par. I det senare fallet kommer förbehandlingsdirektivet att användas. Ett nyckel / värdepar kan fortfarande vara namnen på gifta par. I länder där det finns polygami kommer det att finnas olika fruar för en man.

Bildandet av en karta

En karta är inte en tvådimensionell matris med två kolumner. En karta fungerar med en hash-funktion. Nyckeln kodas av hashfunktionen till ett heltal i en matris. Det är denna matris som innehåller värdena. Så det finns faktiskt en matris med värdena och tangenterna mappas till matrisens index, och så görs korrespondensen mellan nycklar och värden. Hashing är ett omfattande ämne och omfattas inte av den här artikeln.

Slutsats

En karta, även känd som en associerande matris, är en lista med element där varje element är ett nyckel / värdepar. Så varje tangent motsvarar ett värde. I C ++ implementeras kartan som en datastruktur med medlemsfunktioner och operatörer. En ordnad karta är en där elementparen har ordnats med nycklar. En oordnad karta är en där det inte finns någon beställning.

Tekniskt sett består en hash av par element. Faktum är att paret är en hel datastruktur med sina medlemsfunktioner och operatörer. De två mallparametrarna för paret är samma två mallparametrar för unordered_map.

Initieringslistan för kartan är en bokstavlig bokstav av bokstäver. Varje intern bokstav består av två objekt, nyckel / värde-paret.

Medlemsfunktionerna och operatörerna för unordered_map kan kategoriseras under följande rubriker: unordered_map-konstruktion / kopieringskonstruktion, unordered_map Capacity, unordered_map iterator, unordered_map Operations och unordered_map Modifiers.

En oordnad karta används när en nyckel måste mappas till ett värde.

Chrys

Strid om Wesnoth 1.13.6 Utveckling släppt
Strid om Wesnoth 1.13.6 släpptes förra månaden, är den sjätte utvecklingsversionen i 1.13.x-serien och den levererar ett antal förbättringar, framför ...
Så här installerar du League Of Legends på Ubuntu 14.04
Om du gillar League of Legends är det här en möjlighet för dig att testa League of Legends. Observera att LOL stöds på PlayOnLinux om du är en Linux-a...
Installera det senaste OpenRA-strategispelet på Ubuntu Linux
OpenRA är en Libre / Free Real Time Strategy-spelmotor som återskapar de tidiga Westwood-spelen som det klassiska Command & Conquer: Red Alert. Distri...