C ++

Jedinečné a usporiadané kontajnery v jazyku C ++

Jedinečné a usporiadané kontajnery v jazyku C ++
6, 10, 2, 8, 4 je množina; 2, 4, 6, 8, 10 je množina rovnakých celých čísel usporiadaných vzostupne. V matematike má množina jedinečné prvky (odlišné prvky), to znamená, že žiaden prvok sa nevyskytuje viackrát. Multiset je ďalej množina, v ktorej sa ľubovoľný prvok môže vyskytnúť viackrát. 6, 6, 10, 2, 2, 8, 4, 4, 4 je multiset. 2, 2, 4, 4, 4, 6, 6, 8, 10 je rovnaká multiset, ale s prvkami usporiadanými vzostupne. Tento článok sa nezaoberá multisetom. Zaoberá sa dátovou štruktúrou C ++ nazvanou, set.

Mapa v softvéri je ako pole, ale je to pole s dvoma stĺpcami namiesto jedného. Prvý stĺpec obsahuje kľúče a druhý stĺpec obsahuje hodnoty. Každý riadok je jeden pár, ktorý vytvára pár kľúč / hodnota. Kľúč priamo súvisí s jeho hodnotou.

Príklad mapy je 'c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. Prvý pár kľúč / hodnota, ktorý je sem vložený, je 'c', 3, kde 'c' je kľúč a 30 je hodnota. Táto mapa nie je zoradená podľa kľúčov. Zoradenie tejto mapy podľa kľúčov vytvorí 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Všimnite si, že môžu existovať duplicitné hodnoty, ale nie duplicitné kľúče. Objednaná mapa je mapa zoradená podľa kľúčov.

Multiset predstavuje sadu, rovnako ako multimapa mapu. To znamená, že existujú mapy s duplikátmi kľúčov. Príkladom multimap je 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. A ako je uvedené vyššie, tento článok sa nezaoberá multimapou, skôr sa zaoberá dátovou štruktúrou C ++ nazvanou map.

V C ++ je dátová štruktúra štruktúra s vlastnosťami (dátové členy) a metódami (členské funkcie). Údaje o štruktúre sú zoznam; sada je zoznam; mapa je zoznam párov kľúč / hodnota.

Tento článok pojednáva o základoch množín a máp v jazyku C ++ a na lepšie pochopenie tohto článku by mal mať čitateľ základné znalosti jazyka C++.

Obsah článku:

Trieda a jej objekty:

V C ++ sa množina, mapa a ďalšie podobné štruktúry nazývajú kontajnery. Trieda je zovšeobecnená jednotka s dátovými členmi, ktoré sú premennými, a príbuznými členskými funkciami. Keď majú dátové členy dané hodnoty, vytvorí sa objekt. Objekt sa však formuje v procese zvanom inštancia. Pretože trieda môže viesť k rôznym hodnotám pre tie isté premenné dátových členov, z tej istej triedy je možné vytvoriť inštanciu rôznych objektov.

V C ++ je nepoužiteľnou sadou trieda, ako aj nepoužiteľná mapa. Keď sa objekt vytvorí z nepoužiteľnej množiny alebo nepoužiteľnej mapy, objekt sa stane skutočnou dátovou štruktúrou. S dátovými štruktúrami množín a máp je hlavným údajovým členom zoznam. Sada a mapa tvoria skupinu kontajnerov, ktoré sa nazývajú objednané asociatívne kontajnery. Existuje aj neusporiadaná množina a neusporiadaná mapa, ktoré sa však v tomto článku bohužiaľ nezaoberajú.

Vytvorenie súpravy alebo mapy:

Instanciou množiny z jej triedy množín sa vytvorí množina; vytvorenie inštancie mapy z jej triedy máp je vytvorenie mapy. Takto vytvorený objekt dostane názov podľa výberu programátora.

S cieľom vytvoriť súpravu by program mal začínať:

#include
#include
pomocou namespace std;

Všimnite si smernicu „#include ”, Ktorý obsahuje knižnicu množín, ktorá má triedu množiny, z ktorej budú inštancované dátové štruktúry množiny.

Aby bolo možné vytvoriť mapu, program by mal začínať:

#include
#include
pomocou namespace std;

Všimnite si smernicu „#include ”, Ktorý obsahuje knižnicu máp, ktorá má triedu máp, z ktorej budú inštanované mapové dátové štruktúry.

Syntax na vytvorenie prázdnej množiny je:

nastaviť objectName

Príklad:

nastaviť setObj;

Príkladom vytvorenia súpravy s obsahom je:

nastaviť setObj (6, 10, 2, 8, 4);

Syntax na vytvorenie prázdnej mapy je:

mapa objectName

Príklad:

mapa mapObj;

Príkladom na vytvorenie mapy s obsahom je:

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

Základy iterátora:

Iterátor je prepracovaný ukazovateľ, pomocou ktorého je možné prechádzať zoznamom dátovej štruktúry od začiatku do konca.

Funkcia member () ()

Členská funkcia start () vráti iterátor, ktorý ukazuje na prvý prvok zoznamu. Nasledujúci príklad to ilustruje pre súpravu:

nastaviť setObj (6, 10, 2, 8, 4);
nastaviť:: iterátor iter = setObj.začať();
cout << *iter << '\n';

Všimnite si, že spôsob set () bol použitý v prípade setObj a bodkového operátora. iter je vrátený objekt iterátora. Všimnite si tiež spôsob jeho vyhlásenia. * je operátor smerovania. Ako sa používa s iterom, vráti prvý prvok množiny; prvý prvok je 2 namiesto 6 - pozri vysvetlenie nižšie.

Nasledujúci príklad ilustruje použitie funkcie start () pre mapu:

mapa mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: iterátor iter = mapObj.začať();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Všimnite si, že spôsob start () bol použitý s mapObj a bodkovým operátorom. iter je vrátený objekt iterátora. Všimnite si tiež spôsob jeho vyhlásenia. „Prvý“, ako sa tu používa, označuje kľúč. „Druhý“ označuje hodnotu zodpovedajúcu kľúču. Sledujte, ako sa pri iterácii použili na získanie komponentov počiatočných prvkov v zozname. Prvý prvok je a, 10 namiesto c, 30 - pozri vysvetlenie nižšie.

Členská funkcia „begin () const“

Členská funkcia „begin () const“ vráti iterátor, ktorý ukazuje na prvý prvok zoznamu, keď deklarácia množiny začína reťazcom const (pre konštantu). Za tejto podmienky hodnotu v zozname, na ktorú sa vracia iterátor, nemôže iterátor zmeniť. Nasledujúci príklad ilustruje jeho použitie pre súpravu:

konšt setObj (6, 10, 2, 8, 4);
nastaviť:: const_iterator iter = setObj.začať();
cout << *iter << '\n';

Všimnite si, že spôsob set () bol použitý s setObj a bodkovým operátorom. Tesne po začiatku () nebol napísaný žiadny reťazec „const“. Deklarácii však predchádzalo „const“. iter tu je vrátený konštantný iteračný objekt, ktorý sa líši od bežného iterátora. Všimnite si tiež spôsob jeho vyhlásenia. * je operátor navádzania; ako sa používa s iterom, vráti prvý prvok množiny. Prvý prvok je 2 namiesto 6 - pozri vysvetlenie nižšie.

Nasledujúci príklad ilustruje použitie funkcie „start () const“ pre mapu:

mapa const mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: const_iterator iter = mapObj.začať();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Všimnite si, že spôsob start () bol použitý s mapObj a bodkovým operátorom. Tesne po začiatku () nebol napísaný žiadny reťazec „const“. Deklarácii však predchádzalo „const“. iter tu je vrátený konštantný iteračný objekt, ktorý sa líši od bežného iterátora. Všimnite si tiež spôsob jeho vyhlásenia. „Prvý“, ako sa tu používa, označuje kľúč; „Druhý“, ako sa tu používa, označuje hodnotu zodpovedajúcu kľúču. Sledujte, ako sa pri iterácii použili na získanie komponentov počiatočných prvkov v zozname. Prvý prvok je a, 10 namiesto c, 30 - pozri vysvetlenie nižšie.

Člen end () Funkcia

Členská funkcia end () vracia iterátor, ktorý ukazuje tesne za koniec zoznamu. Nasledujúci príklad to ilustruje pre súpravu:

nastaviť setObj (6, 10, 2, 8, 4);
nastaviť:: iterátor iter = setObj.koniec();
cout << *iter << '\n';

Všimnite si, že spôsob end () bol použitý s setObj a bodkovým operátorom. iter je vrátený objekt iterátora. Všimnite si tiež spôsob jeho vyhlásenia. * je operátor navádzania; ako sa používa s iterom, vráti posledný + 1 prvok množiny. V počítači autora je tento posledný +1 prvok 5, ktorý nie je na zozname. Tento prvok teda nepoužívajte.

Nasledujúci príklad ilustruje použitie funkcie end () pre mapu:

mapa mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: iterátor iter = mapObj.koniec();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Všimnite si, že spôsob end () bol použitý s mapObj a bodkovým operátorom. iter je vrátený objekt iterátora. Všimnite si tiež spôsob jeho vyhlásenia. * je operátor navádzania; ako sa používa s iterom, vráti posledný +1 bod mapy. V počítači autora je tento posledný +1 prvok 0, ktorý nie je v zozname. Tento prvok teda nepoužívajte.

Členská funkcia „end () const“

Členská funkcia „end () const“ vracia iterátor, ktorý ukazuje hneď za koniec zoznamu, keď deklarácia množiny začína reťazcom const (pre konštantu). Za tejto podmienky hodnotu v zozname, na ktorú sa vracia iterátor, nemôže iterátor zmeniť. Nasledujúci príklad ilustruje jeho použitie pre súpravu:

konšt setObj (6, 10, 2, 8, 4);
nastaviť:: const_iterator iter = setObj.koniec();
cout << *iter << '\n';

Všimnite si, že spôsob end () bol použitý s setObj a bodkovým operátorom. Tesne po konci () nebol napísaný žiadny reťazec „const“. Deklarácii však predchádzalo „const“. iter je vrátený objekt iterátora. Všimnite si tiež spôsob jeho vyhlásenia. * je operátor navádzania; ako sa používa s iterom, vráti posledný + 1 prvok množiny.

Nasledujúci príklad ilustruje použitie funkcie „end () const“ pre mapu:

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

Všimnite si, že spôsob end () bol použitý s mapObj a bodkovým operátorom. Tesne po konci () nebol napísaný žiadny reťazec „const“. Deklarácii však predchádzalo „const“. iter je vrátený konštantný iterátorový objekt, ktorý sa líši od bežného iterátora. Pozorne tiež sledujte spôsob, akým je vyhlásený.

Prístup k prvku pre súpravu a mapu:

Nastaviť

Pri množine sa prvok číta pomocou operátora indirection. Prvé dva prvky množiny sa čítajú v nasledujúcom príklade:

nastaviť setObj (6, 10, 2, 8, 4);
nastaviť:: iterátor iter = setObj.začať();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

Výstup je 2, potom nasleduje 4 - pozri vysvetlenie nižšie. Ak chcete ukazovať na ďalší prvok zoznamu, iterátor sa zvýši.

Poznámka: Prvok nie je možné zmeniť pomocou indirection operátora pre množinu. Napríklad „* iter = 9;“ nie je možné.

mapa

Mapa sa skladá z párov kľúč / hodnota. Hodnotu je možné načítať pomocou príslušného klávesu a meniť pomocou rovnakého klávesu. Ilustruje to nasledujúci segment kódu:

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

Výstup je:

20
55

Bodkový operátor sa tu nepoužil. Namiesto toho je použitý operátor hranatých zátvoriek, ktorý berie kľúč ako obsah.

Poradie prvkov v súprave alebo na mape:

Prvky je možné vkladať do sady v ľubovoľnom poradí. Po vložení však sada usporiada svoje prvky vo vzostupnom poradí. Vzostupné poradie je predvolené poradie. Ak je potrebné zostupné poradie, potom musí byť množina deklarovaná ako v nasledujúcom príklade:

nastaviť > setObj (6, 10, 2, 8, 4);

Takže po type, napr.g., int, pre šablónu je čiarka, za ktorou nasleduje „väčšie”V uhlových zátvorkách.

Prvky je možné vkladať do mapy v ľubovoľnom poradí. Po vložení však mapa usporiada svoje prvky vo vzostupnom poradí podľa kľúča (iba), pričom sa zachová vzťah medzi každým kľúčom a jeho hodnotou. Vzostupné poradie je predvolené poradie; ak je potrebné zostupné poradie, musí byť mapa deklarovaná ako v nasledujúcom príklade:

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

Takže po typovom páre napr.g., „Char, int“ pre šablónu je čiarka a za ňou nasleduje „väčšie“”V uhlových zátvorkách.

Traversing set

Na prechádzanie množiny je možné použiť cyklus while alebo for-loop s iterátorom. Nasledujúci príklad používa cyklus for-loop na prechádzanie sady, ktorá bola nakonfigurovaná v zostupnom poradí:

nastaviť > setObj (6, 10, 2, 8, 4);
pre (set:: iterátor iter = setObj.začať(); iter != setObj.koniec(); ++ iter)

cout << *iter << ";

Výstup je:

10 8 6 4 2

Prírastok iterátora ho nasmeruje na ďalší prvok.

Prechádzanie po mape

Trasu while alebo for-loop s iterátorom je možné použiť na pohyb po mape. Nasledujúci príklad používa cyklus for-loop na prechádzanie mapou, ktorá bola nakonfigurovaná v zostupnom poradí:

mapa > mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
pre (mapa:: iterátor iter = mapObj.začať(); iter != mapObj.koniec(); ++ iter)

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

Výstup je:

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

Prírastok iterátora ho nasmeruje na ďalší prvok. „Prvý“ v kóde označuje kľúč a „druhý“ označuje zodpovedajúcu hodnotu. Všimnite si, ako boli tieto hodnoty získané pre výstup.

Ďalšie bežne používané členské funkcie:

Funkcia size ()

Táto funkcia vráti celé číslo, čo je počet prvkov v zozname. Nastaviť príklad:

nastaviť > setObj (6, 10, 2, 8, 4);
cout << setObj.size() << '\n';

Výstup je 5.

Príklad mapy:

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

Výstup je 5.

Funkcia insert ()

nastaviť

sada neumožňuje duplikát. Takže akýkoľvek vložený duplikát je ticho odmietnutý. Pri množine je argumentom funkcie insert () hodnota, ktorá sa má vložiť. Hodnota sa umiestni do polohy, v ktorej zostane poradie v množine stúpajúce alebo klesajúce. Príklad:

nastaviť setObj (6, 10, 2, 8, 4);
setObj.vložka (6);
setObj.vložka (9);
setObj.vložka (12);
pre (set:: iterátor iter = setObj.začať(); iter != setObj.koniec(); ++ iter)

cout << *iter << ";

Výstup je:

2 4 6 8 9 10 12

Poznámka: Členskú funkciu insert () je možné použiť na vyplnenie prázdnej množiny.

mapa

mapa neumožňuje duplikát podľa kľúča. Takže akýkoľvek vložený duplikát je ticho odmietnutý. V prípade mapy je argumentom funkcie insert () pár kľúč / hodnota v zložených zátvorkách. Element je zasadený do polohy klávesom, v ktorom zostáva poradie na mape stúpajúce alebo klesajúce. Príklad:

mapa mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.vložiť ('e', 80);
mapObj.vložiť ('f', 50);
mapObj.vložiť ('g', 60);
pre (mapa:: iterátor iter = mapObj.začať(); iter != mapObj.koniec(); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Výstup je:

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

Poznámka: Členskú funkciu insert () je možné použiť na vyplnenie prázdnej mapy.

Funkcia empty ()

Táto funkcia vráti hodnotu true, ak je zoznam prázdny, a hodnotu false, ak je to inak. Nastaviť príklad:

nastaviť setObj (6, 10, 2, 8, 4);
bool ret = setObj.prázdne ();
cout << ret << '\n';

Výstup je 0 pre hodnotu false, čo znamená, že množina tu nie je prázdna.

Príklad mapy:

mapa mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
bool ret = mapObj.prázdne ();
cout << ret << '\n';

Výstup je 0 pre false, čo znamená, že mapa tu nie je prázdna.

Funkcia mazania ()

nastaviť

Zvážte nasledujúci segment kódu:

nastaviť setObj (10, 20, 30, 40, 50);
nastaviť:: iterátor iter = setObj.začať();
nastaviť:: iterátor itr = setObj.vymazať (iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.vymazať (itr);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

Výstup je:

nová veľkosť: 4
ďalšia hodnota: 20
nová veľkosť: 3
ďalšia hodnota: 30

Funkcia erase () berie iterátor, ktorý ukazuje na prvok ako argument. Po vymazaní prvku funkcia erase () vráti iterátor, ktorý ukazuje na nasledujúci element.

mapa

Zvážte nasledujúci segment kódu:

mapa mapObj ('a', 10, 'b', 20, 'c', 30, 'd', 40, 'e', 50);
mapa:: iterátor iter = mapObj.začať();
mapa:: iterátor itr = mapObj.vymazať (iter);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = mapObj.vymazať (itr);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

Výstup je:

nová veľkosť: 4
nasledujúci hodnotový pár: b, 20
nová veľkosť: 3
nasledujúci hodnotový pár: c, 30

Funkcia erase () berie iterátor, ktorý ukazuje na prvok ako argument. Po vymazaní prvku funkcia erase () vráti iterátor, ktorý ukazuje na nasledujúci element.

Funkcia clear ()

Funkcia clear () odstráni všetky prvky v zozname. Nastaviť príklad:

nastaviť setObj (6, 10, 2, 8, 4);
setObj.jasný();
cout << setObj.size() << '\n';

Výstup je 0.

príklad mapy:

mapa mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.jasný();
cout << mapObj.size() << '\n';

Výstup je 0.

Záver:

Množina dátovej štruktúry v C ++ je štruktúra, v ktorej je zoznam prvkov predvolene uložený vo vzostupnom poradí alebo v zostupnom poradí podľa voľby programátora. Všetky prvky súpravy sú jedinečné. Štruktúra mapových údajov v C ++ je štruktúra, v ktorej je zoznam hašovaním dvojíc kľúč / hodnota, ktoré sú predvolene uložené vo vzostupnom poradí klávesov, alebo v zostupnom poradí podľa výberu programátora. Kľúče sú tiež jedinečné a môžu existovať duplicitné hodnoty. Hlavným údajovým členom ktorejkoľvek zo štruktúr je zoznam. Každá z týchto štruktúr má členské funkcie, z ktorých niektoré sa bežne používajú.

Hry Ako nainštalovať League Of Legends na Ubuntu 14.04
Ako nainštalovať League Of Legends na Ubuntu 14.04
Ak ste fanúšikom League of Legends, potom je to pre vás príležitosť otestovať spustenie League of Legends. Upozorňujeme, že program PlayOnLinux podpor...
Hry Nainštalujte si najnovšiu strategickú hru OpenRA na Ubuntu Linux
Nainštalujte si najnovšiu strategickú hru OpenRA na Ubuntu Linux
OpenRA je herný engine Libre / Free Real Time Strategy, ktorý obnovuje rané hry z Westwoodu, ako napríklad klasické Command & Conquer: Red Alert. Dist...
Hry Nainštalujte si najnovší Dolphin Emulator pre Gamecube a Wii na Linuxe
Nainštalujte si najnovší Dolphin Emulator pre Gamecube a Wii na Linuxe
Emulátor Dolphin vám umožní hrať vybrané hry Gamecube a Wii na osobných počítačoch Linux (PC). Emulátor Dolphin, ktorý je voľne dostupným emulátorom ...