C ++

Unika och beställda behållare i C ++

Unika och beställda behållare i C ++
6, 10, 2, 8, 4 är ​​en uppsättning; 2, 4, 6, 8, 10 är en uppsättning av samma heltal, ordnade i stigande ordning. I matematik har en uppsättning unika element (distinkta element), det vill säga inget element förekommer mer än en gång. Dessutom är en multiset en uppsättning där varje element kan förekomma mer än en gång. 6, 6, 10, 2, 2, 8, 4, 4, 4 är ​​en multiset. 2, 2, 4, 4, 4, 6, 6, 8, 10 är samma multiset, men med elementen ordnade i stigande ordning. Denna artikel handlar inte om multiset. Den behandlar C ++ datastrukturen kallad, set.

En karta i programvara är som en array, men det är en array med två kolumner istället för en. Den första kolumnen har tangenterna och den andra kolumnen har värdena. Varje rad är ett par, vilket gör ett nyckel / värdepar. En nyckel är direkt relaterad till dess värde.

Ett exempel på en karta är 'c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. Det första nyckel / värdeparet som infogas här är 'c', 3, där 'c' är nyckeln och 30 är värdet. Denna karta ordnas inte med nycklar. Att beställa den här kartan med tangenter ger 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Observera att det kan finnas dubblerade värden, men inte duplicerade nycklar. En beställd karta är en karta som ordnas efter nycklar.

En multiset är en uppsättning, som en multimap är en karta. Det betyder att det finns kartor med dubbla nycklar. Ett exempel på en multikarta är 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. Och som nämnts ovan handlar den här artikeln inte om multimap, utan den handlar om C ++ datastrukturen som kallas map.

I C ++ är en datastruktur en struktur med egenskaper (data medlemmar) och metoder (medlemsfunktioner). Uppgifterna för strukturen är en lista; en uppsättning är en lista; en karta är en lista med nyckel / värdepar.

Denna artikel diskuterar grunderna för uppsättningar och kartor i C ++, och för att bättre förstå den här artikeln borde läsaren ha haft en grundläggande kunskap om C++.

Artikelinnehåll:

Klass och dess föremål:

I C ++ kallas uppsättningen, kartan och andra liknande strukturer containrar. En klass är en generaliserad enhet med datamedlemmar, vilka är variabler och medlemsfunktioner som är relaterade. När datamedlemmar ges värden bildas ett objekt. Emellertid bildas ett objekt i en process som kallas instantiering. Eftersom en klass kan leda till olika värden för samma datamedelsvariabler, kan olika objekt sedan instansieras från samma klass.

I C ++ är en oanvändbar uppsättning en klass såväl som en oanvändbar karta. När ett objekt instansieras från den oanvändbara uppsättningen eller den oanvändbara kartan blir objektet den verkliga datastrukturen. Med uppsättnings- och kartdatastrukturerna är huvuddatamedlemmen en lista. Tja, uppsättningen och kartan bildar en grupp containrar som kallas, beställda associativa containrar. Oordnad uppsättning och den oordnade kartan finns också, men de behandlas tyvärr inte i den här artikeln.

Skapa en uppsättning eller en karta:

Att installera en uppsättning från sin uppsättningsklass skapar en uppsättning; att skapa en karta från sin kartklass skapar en karta. Objektet som skapats får ett namn som programmeraren väljer.

För att skapa en uppsättning bör programmet börja med:

#omfatta
#omfatta
använder namnrymd std;

Observera direktivet ”#include ”, Som inkluderar det uppsatta biblioteket som har den uppsättningsklass från vilken uppsatta datastrukturer kommer att instansieras.

För att skapa en karta bör programmet börja med:

#omfatta
#omfatta
använder namnrymd std;

Observera direktivet ”#include ”, Som inkluderar kartbiblioteket som har kartklassen från vilken kartdatastrukturer kommer att instanseras.

Syntaxen för att skapa en tom uppsättning är:

uppsättning objektnamn

Exempel:

uppsättning setObj;

Ett exempel för att skapa en uppsättning med innehåll är:

uppsättning setObj (6, 10, 2, 8, 4);

Syntaxen för att skapa en tom karta är:

Karta objektnamn

Exempel:

Karta mapObj;

Ett exempel på att skapa en karta med innehåll är:

Karta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Grunderna om Iterator:

En iterator är en utarbetad pekare som kan användas för att korsa listan över datastrukturen från början till slut.

Start () -medlem Funktion

Funktionen begin () -medlem returnerar en iterator som pekar på det första elementet i listan. Följande exempel illustrerar detta för uppsättningen:

uppsättning setObj (6, 10, 2, 8, 4);
uppsättning:: iterator iter = setObj.Börja();
cout << *iter << '\n';

Observera hur start () har använts med setObj och punktoperatören. iter är det returnerade iteratorobjektet. Notera också hur det har förklarats. * är indirection-operatören. Som det används med iter returnerar det det första elementet i uppsättningen; det första elementet är 2 istället för 6 - se förklaring nedan.

Följande exempel illustrerar användningen av start () -funktionen för kartan:

Karta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
Karta:: iterator iter = mapObj.Börja();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Observera hur start () har använts med mapObj och punktoperatören. iter är det returnerade iteratorobjektet. Notera också hur det har förklarats. ”Första”, som det används här, hänvisar till nyckeln. "Andra" avser det värde som motsvarar tangenten. Observera hur de har använts med iter för att erhålla startelementkomponenterna i listan. Det första elementet är a, 10 istället för c, 30 - se förklaringen nedan.

Funktionen "begin () const" -medlem

Member-funktionen "begin () const" returnerar en iterator som pekar på det första elementet i listan när uppsättningen för set börjar med const (för konstant). Under detta villkor kan värdet i listan, som refereras av iteratorn, inte ändras av iteratorn. Följande exempel illustrerar dess användning för uppsättningen:

const set setObj (6, 10, 2, 8, 4);
uppsättning:: const_iterator iter = setObj.Börja();
cout << *iter << '\n';

Observera hur start () har använts med setObj och punktoperatören. Ingen "const" har skrivits strax efter start (). Emellertid har "const" föregått deklarationen. iter här är det returnerade konstanta iteratorobjektet, som skiljer sig från det normala iteratorn. Notera också hur det har förklarats. * är indirection-operatören; som används med iter returnerar det det första elementet i uppsättningen. Det första elementet är 2 istället för 6 - se förklaring nedan.

Följande exempel illustrerar användningen av "start () const" -funktionen för kartan:

const karta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
Karta:: const_iterator iter = mapObj.Börja();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Observera hur start () har använts med mapObj och punktoperatören. Ingen "const" har skrivits strax efter start (). Emellertid har "const" föregått deklarationen. iter här är det returnerade konstanta iteratorobjektet, som skiljer sig från det normala iteratorn. Notera också hur det har förklarats. "Första", som används här, hänvisar till nyckeln; ”Andra”, som används här, avser det värde som motsvarar nyckeln. Observera hur de har använts med iter för att erhålla startelementkomponenterna i listan. Det första elementet är a, 10 istället för c, 30 - se förklaring nedan.

End () -medlem Funktion

Member-funktionen end () returnerar en iterator som pekar strax efter slutet av listan. Följande exempel illustrerar detta för uppsättningen:

uppsättning setObj (6, 10, 2, 8, 4);
uppsättning:: iterator iter = setObj.slutet();
cout << *iter << '\n';

Observera hur slut () har använts med setObj och punktoperatören. iter är det returnerade iteratorobjektet. Notera också hur det har förklarats. * är indirection-operatören; som det används med iter returnerar det sista + 1-elementet i uppsättningen. I författarens dator är det sista + 1-elementet 5, vilket inte finns i listan. Så var försiktig så att du inte använder detta element.

Följande exempel illustrerar användningen av funktionen end () för kartan:

Karta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
Karta:: iterator iter = mapObj.slutet();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Observera hur slutet () har använts med mapObj och punktoperatören. iter är det returnerade iteratorobjektet. Notera också hur det har förklarats. * är indirection-operatören; som används med iter, returnerar det sista + 1-elementet på kartan. På författarens dator är det sista + 1-elementet , 0, vilket inte finns i listan. Så var försiktig så att du inte använder detta element.

Funktionen "end () const" -medlem

"End () const" medlemsfunktionen returnerar en iterator som pekar strax efter slutet av listan när deklarationen för uppsättningen börjar med const (för konstant). Under detta villkor kan värdet i listan, som refereras av iteratorn, inte ändras av iteratorn. Följande exempel illustrerar dess användning för uppsättningen:

const set setObj (6, 10, 2, 8, 4);
uppsättning:: const_iterator iter = setObj.slutet();
cout << *iter << '\n';

Observera hur slut () har använts med setObj och punktoperatören. Ingen "const" har skrivits strax efter slutet (). Emellertid har "const" föregått deklarationen. iter är det returnerade iteratorobjektet. Notera också hur det har förklarats. * är indirection-operatören; som det används med iter returnerar det sista + 1-elementet i uppsättningen.

Följande exempel illustrerar användningen av "end () const" -funktionen för kartan:

const karta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
Karta:: const_iterator iter = mapObj.slutet();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Observera hur slut () har använts med mapObj och punktoperatören. Ingen "const" har skrivits strax efter slutet (). Emellertid har "const" föregått deklarationen. iter är det returnerade konstanta iteratorobjektet, vilket skiljer sig från det normala iteratorn. Observera också noggrant hur det har förklarats.

Elementåtkomst för uppsättning och karta:

Uppsättning

Med uppsättningen läses elementet med indirection-operatören. De två första elementen i en uppsättning läses i följande exempel:

uppsättning setObj (6, 10, 2, 8, 4);
uppsättning:: iterator iter = setObj.Börja();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

Utgången är 2, följt av 4 - se förklaringen nedan. För att peka på nästa element i listan ökas iteratorn.

Obs! Ett element kan inte ändras med indirection-operatören för uppsättningen. Till exempel “* iter = 9;” är inte möjligt.

Karta

En karta består av nyckel / värdepar. Ett värde kan läsas med motsvarande tangent och ändras med samma tangent. Följande kodsegment illustrerar detta:

Karta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj['b'] << '\n';
mapObj ['b'] = 55;
cout << mapObj['b'] << '\n';

Utgången är:

20
55

Punktoperatören har inte använts här. Istället är det hakparentesoperatören, som tar nyckeln som innehåll, som har använts.

Elementordning i en uppsättning eller karta:

Element kan sättas in i en uppsättning, i valfri ordning. Men när den väl har satts in ordnar den om sina element i stigande ordning. Stigande order är standardorder. Om fallande ordning behövs måste uppsättningen deklareras som i följande exempel:

uppsättning > setObj (6, 10, 2, 8, 4);

Så efter typen, e.g., int, för mallen finns ett kommatecken, följt av ”större”I vinkelfästena.

Element kan infogas på en karta i valfri ordning. När kartan väl har satts in ordnar den om sina element i stigande ordning med tangent (endast) samtidigt som förhållandet mellan varje tangent och dess värde bibehålls. Stigande ordning är standardordern. om fallande ordning behövs måste kartan deklareras som i följande exempel:

Karta > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Så efter typparet, e.g., “Char, int”, för mallen finns det ett kommatecken, följt av “större”I vinkelfästena.

Korsar en uppsättning

While-loop eller for-loop med iteratorn kan användas för att korsa en uppsättning. Följande exempel använder en for-loop för att korsa en uppsättning som har konfigurerats i fallande ordning:

uppsättning > setObj (6, 10, 2, 8, 4);
för (set:: iterator iter = setObj.Börja(); iter != setObj.slutet(); ++ iter)

cout << *iter << ";

Utgången är:

10 8 6 4 2

Att öka en iterator pekar på nästa element.

Korsa en karta

While-loop eller for-loop med iteratorn kan användas för att korsa en karta. Följande exempel använder en for-loop för att korsa en karta som har konfigurerats i fallande ordning:

Karta > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
för (karta:: iterator iter = mapObj.Börja(); iter != kartaObj.slutet(); ++ iter)

cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Utgången är:

e, 40, d, 30, c, 30, b, 20, a, 10,

Att öka en iterator pekar på nästa element. "Första", i koden, hänvisar till nyckeln och "andra" avser motsvarande värde. Observera hur dessa värden har erhållits för utdata.

Andra vanliga medlemsfunktioner:

Funktionen storlek ()

Denna funktion returnerar ett heltal, vilket är antalet element i listan. Exempel:

uppsättning > setObj (6, 10, 2, 8, 4);
cout << setObj.size() << '\n';

Utgången är 5.

Kartexempel:

Karta > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj.size() << '\n';

Utgången är 5.

Infoga () -funktionen

uppsättning

set tillåter inte duplikat. Så alla dubbletter som infogas avvisas tyst. Med uppsättningen är argumentet för funktionen insert () det värde som ska infogas. Värdet monteras i en position där ordningen i uppsättningen förblir stigande eller fallande. Exempel:

uppsättning setObj (6, 10, 2, 8, 4);
setObj.insats (6);
setObj.insats (9);
setObj.insats (12);
för (set:: iterator iter = setObj.Börja(); iter != setObj.slutet(); ++ iter)

cout << *iter << ";

Utgången är:

2 4 6 8 9 10 12

Obs !: Infoga () medlemsfunktionen kan användas för att fylla i en tom uppsättning.

Karta

karta tillåter inte duplicering med nyckel. Så alla dubbletter som infogas avvisas tyst. Med kartan är argumentet för infoga () -funktionen nyckel / värde-paret i hakparenteser. Elementet monteras i en position med nyckel, i vilken ordningen på kartan förblir stigande eller fallande. Exempel:

Karta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
kartaObj.infoga ('e', 80);
kartaObj.infoga ('f', 50);
kartaObj.infoga ('g', 60);
för (karta:: iterator iter = mapObj.Börja(); iter != kartaObj.slutet(); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Utgången är:

a, 10, b, 20, c, 30, d, 30, e, 40, f, 50, g, 60,

Obs !: Infoga () medlemsfunktionen kan användas för att fylla i en tom karta.

Den tomma () funktionen

Den här funktionen returnerar true om listan är tom och falsk om inte annat. Exempel:

uppsättning setObj (6, 10, 2, 8, 4);
bool ret = setObj.tömma();
cout << ret << '\n';

Utgången är 0 för falskt, vilket innebär att uppsättningen här inte är tom.

Kartexempel:

Karta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
bool ret = mapObj.tömma();
cout << ret << '\n';

Utgången är 0 för falskt, vilket betyder att kartan här inte är tom.

Radera () -funktionen

uppsättning

Tänk på följande kodsegment:

uppsättning setObj (10, 20, 30, 40, 50);
uppsättning:: iterator iter = setObj.Börja();
uppsättning:: iterator itr = setObj.radera (iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.radera (itr);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

Utgången är:

ny storlek: 4
nästa värde: 20
ny storlek: 3
nästa värde: 30

Funktionen radera () tar en iterator som pekar på ett element som ett argument. Efter radering av elementet returnerar funktionen radera () en iterator som pekar på nästa element.

Karta

Tänk på följande kodsegment:

Karta mapObj ('a', 10, 'b', 20, 'c', 30, 'd', 40, 'e', 50);
Karta:: iterator iter = mapObj.Börja();
Karta:: iterator itr = mapObj.radera (iter);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = mapObj.radera (itr);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

Utgången är:

ny storlek: 4
nästa värdepar: b, 20
ny storlek: 3
nästa värdepar: c, 30

Funktionen radera () tar en iterator som pekar på ett element som ett argument. Efter radering av elementet returnerar funktionen radera () en iterator som pekar på nästa element.

Den tydliga funktionen ()

Funktionen clear () tar bort alla element i listan. Exempel:

uppsättning setObj (6, 10, 2, 8, 4);
setObj.klar();
cout << setObj.size() << '\n';

Utgången är 0.

karta exempel:

Karta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
kartaObj.klar();
cout << mapObj.size() << '\n';

Utgången är 0.

Slutsats:

En uppsatt datastruktur i C ++ är en struktur där listan över element lagras i stigande ordning som standard eller i fallande ordning efter programmerarens val. Alla element i uppsättningen är unika. En kartdatastruktur i C ++ är en struktur där listan är en hash av nyckel / värdepar, lagrad i stigande ordning på nycklar som standard eller i fallande ordning på nycklar efter programmerarens val. Nycklarna är också unika och det kan finnas dubbla värden. Huvuddatamedlemmen i någon av strukturerna är listan. Endera strukturen har medlemsfunktioner, varav några ofta används.

OpenTTD-handledning
OpenTTD är ett av de mest populära affärssimuleringsspelen där ute. I det här spelet måste du skapa en underbar transportaffär. Du kommer dock att bör...
SuperTuxKart för Linux
SuperTuxKart är en fantastisk titel som är utformad för att ge dig Mario Kart-upplevelsen gratis på ditt Linux-system. Det är ganska utmanande och rol...
Battle for Wesnoth Tutorial
Slaget om Wesnoth är ett av de mest populära open source-strategispel som du kan spela just nu. Det här spelet har inte bara utvecklats under mycket l...