lists stl
Spoznajte všetko o zoznamoch v STK a ich implementácii.
Zoznamy sú sekvenčné kontajnery. Zoznamy obsahujú prvky na nesusediacich miestach. O poliach a vektoroch sme hovorili v našich predchádzajúcich tutoriáloch.
V prípade kontajnerov polí a vektorov, pretože tieto kontajnery ukladajú údaje do súvislej pamäte, sa operácia vloženia do stredu týchto kontajnerov ukazuje ako veľmi nákladná, pretože musíme zodpovedajúcim spôsobom presunúť existujúce prvky, aby sa vytvoril priestor pre nový prvok.
=> Prezrite si tu a preskúmajte celý zoznam výukových programov C ++.
ako hrať swf súbory v systéme Windows 7
Čo sa dozviete:
Prehľad
Zoznam je kontajner, ktorý prekonáva túto nevýhodu polí a vektorových kontajnerov. Umožňuje nám vložiť prvky kamkoľvek do zoznamu bez toho, aby sme spôsobili veľkú réžiu. Ale pokiaľ ide o priechod, zoznamy sú pomalšie ako vektory.
V tomto tutoriále uvidíme implementáciu zoznamov v STL spolu s rôznymi operáciami prechodu, manipulácií a prístupu k zoznamu s príkladmi.
Upozorňujeme, že väčšina operácií so zoznamami je podobná operáciám s vektormi, a preto čitatelia, ktorí si už prečítali náš tutoriál o vektoroch, nebudú mať problémy s interpretáciou konceptov zoznamov.
Vyhlásenie a inicializácia
Pre implementáciu zoznamu kontajnera a využitie všetkých jeho výhod musíme do nášho programu zahrnúť hlavičkový súbor.
#include
Všeobecné vyhlásenie pre zoznamový kontajner je
std::list listName;
Napríklad,môžeme vyhlásiť zoznam s názvom „môj zoznam“ typu int takto:
std::list mylist;
Zoznam môžeme tiež inicializovať v čase deklarácie alebo k nemu pridať prvky pomocou jednej z operácií, ktoré podporuje.
Pozrime sa, ako môžeme inicializovať zoznam, ktorý sme vytvorili vyššie.
std::list mylist = {1, 1, 2, 3, 5};
Vyššie uvedená inicializácia bude uložená v pamäti, ako je uvedené nižšie:
Po inicializácii zoznamu môžeme pristupovať k prvkom zoznamu pomocou iterátora. Funkcie Iterátora „začiatok“ a „koniec“ nám pomáhajú prechádzať prvkami zoznamu.
Poznámka: Iterátor zoznamu podporuje aj ďalšie iterátory, ako sú reverzné iterátory (rbegin, rend), konštantné iterátory (cbegin, cend) a neustále reverzné iterátory (crbegin, crend), ktoré je možné použiť podobným spôsobom ako vektory.
Nasledujúci príklad to ukazuje.
#include #include #include #include using namespace std; int main() { list mylist = {1, 1, 2, 3, 5}; cout<<”List elements are: “; list::iterator it; for(it=mylist.begin();it!=mylist.end();++it) cout<<*it<<” “; }
Výkon:
Prvky zoznamu sú: 1 1 2 3 5
Vo vyššie uvedenom príklade sme teda deklarovali zoznam Fibonacciho sekvencie. Ďalej deklarujeme iterátor rovnakého typu ako zoznam a pomocou slučky for potom vytlačíme obsah zoznamu od začiatku do konca.
Teraz prejdime na operácie alebo funkcie, ktoré nám poskytuje zoznam kontajnerov v STL.
Zoznam operácií
- Vložka: Slúži na vloženie prvku na danom mieste. Vráti iterátor ukazujúci na prvý vložený prvok.
vložka (pos, num_elem, elem)
Kde,
pos => Poloha, v ktorej sa majú vkladať nové prvky.
num_elem => Počet vložených prvkov; predvolená hodnota je 1.
položka => Aktuálna hodnota, ktorá sa má vložiť.
Poďme pochopiť funkciu vloženia pomocou príkladu.
#include #include // for list operations using namespace std; int main() { list mylist = {1,1,2}; list::iterator it = mylist.begin(); // iterator to point to 4th position advance(it,` 3); // inserts 3 at 4th position mylist.insert(it, 3); cout << 'The list after inserting' << ' 1 element using insert() is : '; for (list::iterator i = mylist.begin();i != mylist.end();i++) cout << *i << ' '; cout << endl; }
Výkon:
Zoznam po vložení 1 prvku pomocou insert () je: 1 1 2 3
Toto je príklad na vloženie iba jedného prvku do 4thpozíciu v zozname, ktorá je nakoniec poslednou pozíciou. Preto najskôr máme zoznam, pre ktorý sme definovali iterátor smerujúci na jeho začiatok. Potom posunieme tento iterátor na 4thpozíciu a potom zavolajte insert na vloženie 1 prvku.
Môžeme vložiť aj viac ako jeden prvok, a to zadaním druhého parametra vo funkcii vloženia. Ak to nie je zadané, použije sa predvolená hodnota 1.
- push_back :Pridá nový prvok na koniec zoznamu.
- push_front :Pridá nový prvok na začiatok zoznamu.
Pozrime sa na príklad, ktorý demonštruje použitie funkcií push_back a push_front.
#include #include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3}; cout<<'List elements are: '; printlist(mylist); mylist.push_front(0); mylist.push_back(5); cout<<'
List contents after push_front and push_back: '; printlist(mylist); }
Výkon:
Prvky zoznamu sú: 1 1 2 3
Zoznam obsahu po push_front a push_back: 0 1 1 2 3 5
V tomto príklade najskôr vytvoríme a uvedieme do zoznamu všetky dva prvky, jeden spredu a zozadu pomocou funkcií push_front a push_back. Výstup zobrazí zmenený zoznam po vykonaní oboch funkcií.
- pop_back :Odstráni posledný prvok v zozname, čím sa zmenší jeho veľkosť o 1.
- pop_front :Odstráni prvý prvok v zozname, čím sa zmenší jeho veľkosť o 1.
Nasledujúci príklad ukazuje použitie operácií pop_back a pop_front v zozname.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); mylist.pop_front(); mylist.pop_back(); cout<<'
List contents after push_front and push_back: '; printlist(mylist); }
Výkon:
Prvky zoznamu sú: 1 1 2 3 5
Zoznam obsahu po push_front a push_back: 1 2 3
Ako je popísané v definícii operácií, každá z operácií pop_front a pop_back odstráni prvok z prednej a zadnej časti zoznamu, t. J. Prvého a posledného prvku zoznamu, a teda zakaždým zmenší veľkosť zoznamu o 1.
- veľkosť :Vráti veľkosť zoznamu, tj počet prvkov v zozname.
- prázdny :Skontroluje, či je zoznam prázdny.
- vymazať :Odstráni prvok alebo rozsah prvkov zo zoznamu.
- jasný :Odstráni všetky prvky zo zoznamu zväčšením na 0.
Ďalej uvádzame príklad na demonštráciu použitia všetkých vyššie uvedených funkcií, tj. Veľkosť, prázdny, vymazaný a jasný.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); cout<<'size of the list: '< Výkon:
Prvky zoznamu sú: 1 1 2 3 5
veľkosť zoznamu: 5
Zoznam po vymazaní prvého prvku: 1 2 3 5
Nová veľkosť zoznamu: 4
veľkosť zoznamu po vymazaní: 0
Vyššie uvedený program demonštruje všetky štyri funkcie spojené s kapacitou zoznamu. Vidíme, že veľkosť zoznamu sa zmenší o 1, keď vymažeme 1 prvok zoznamu. Zatiaľ čo v zozname voláme jasnú operáciu, veľkosť je 0, čo znamená, že všetky prvky v zozname sú odstránené.
- spredu :Vráti hodnotu prvého prvku zoznamu.
- späť :Vráti hodnotu posledného prvku zoznamu.
- vymeniť :Zamení obsah jedného zoznamu za obsah iného zoznamu rovnakej veľkosti a typu.
- obrátiť :Algoritmus, ktorý obráti zoznam.
- triediť :Zoradí daný zoznam.
Nasledujúci príklad demonštruje použitie funkcií spredu, zozadu, dozadu, triedenia a výmeny.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); cout<<'
Front of the list: '< Výkon:
Prvky zoznamu sú: 1 1 2 3 5
Predná strana zoznamu: 1
Zadná strana zoznamu: 5
Obrátený zoznam: 5 3 2 1 1
Obsah nepárneho zoznamu: 1 3 5 7 9
Po výmene
môj zoznam: 1 3 5 7 9
Nepárny: 5 3 2 1 1
V tomto kóde najskôr vytlačíme prednú a zadnú hodnotu zoznamu mylist. Potom je tento zoznam obrátený a obrátený zoznam je vytlačený. Potom definujeme ešte jeden nepárny počet, ktorý nie je v akomkoľvek poradí a na jeho zoradenie zavoláme algoritmus ‘Sort’. Potom dva zoznamy zameníme pomocou funkcie swap a vytlačené zoznamy vytlačíme.
- spojiť :Táto funkcia sa používa na prenos obsahu jedného zoznamu do iného zoznamu na určenom mieste.
Oba zoznamy musia byť rovnakého typu.
spoj (pozícia, zoznam);
kde,
position => Poloha, na ktorú sa má preniesť obsah zoznamu.
list => Zoznam, ktorého prvky sa majú preniesť.
Nasledujúci príklad ukazuje použitie spojovacej funkcie.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 8,13}; cout<<'List elements are: '; printlist(mylist); list seclist = {2,3,5}; cout<<'list to be spliced: '; printlist(seclist); list:: iterator it = mylist.begin(); it ++; it++; mylist.splice(it,seclist); cout<<'
List contents after splicing at position 2: '; printlist(mylist); }
Výkon:
Prvky zoznamu sú: 1 1 8 13
zoznam, ktorý sa má spojiť: 2 3 5
Obsah zostavte po zostrihu na pozícii 2: 1 1 2 3 5 8 13
The príklad ukazuje, že používame dva zoznamy. Najskôr sa iterátor mylistu presunie do dvoch pozícií a potom sa vyvolá funkcia spojenia na prenos obsahu druhého zoznamu na tretiu pozíciu prvého zoznamu.
- choď :Na rozdiel od funkcie spojenia, ktorú je možné použiť na prenos obsahu jedného zoznamu do druhého na konkrétnom mieste, operácia zlúčenia priamo zlúči dva zoznamy a vytvorí jeden jediný zoznam. Pre operáciu zlúčenia musia byť oba zoznamy zoradené podľa poradia.
Ďalej je uvedený príklad na demonštráciu funkcie zlúčenia.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1,2,3,5,8}; list seclist = {4,6,7}; cout<<'First List: '; printlist(mylist); cout< Výkon:
Prvý zoznam: 11 2 3 5 8
Druhý zoznam: 4 6 7
Obsah zoznamu po zlúčení dvoch zoznamov:
1 1 2 3 4 5 6 7 8
Vo vyššie uvedenom programe teda máme dva zoznamy, ktoré sú zoradené. Na týchto dvoch zoznamoch nazývame zlúčenie. Výsledný zoznam je zoradený zoznam obsahujúci prvky oboch zoznamov.
xbox one dátum uvedenia náhlavnej súpravy pre virtuálnu realitu
Záver
Dostali sme sa na koniec tohto tutoriálu k Zoznamom v STL. Dúfame, že vám tento návod priniesol nesmierne vedomosti o Zoznamoch v STK.
=> Ak chcete vidieť A-Z výučbových kurzov C ++, kliknite sem.
Odporúčané čítanie