std::list in C++ s Primjerom
Što je std::list?
In C++, std::list se odnosi na spremnik za pohranu. Std:list vam omogućuje umetanje i uklanjanje stavki s bilo kojeg mjesta. Std::list je implementiran kao dvostruko povezana lista. To znači da se podacima popisa može pristupiti dvosmjerno i sekvencijalno.
Popis standardne biblioteke predložaka ne podržava brzi nasumični pristup, ali podržava sekvencijalni pristup iz svih smjerova.
Elemente popisa možete rasporediti u različite dijelove memorije. Informacije potrebne za sekvencijalni pristup podacima pohranjuju se u spremnik. Std::list može se proširiti i smanjiti s oba kraja prema potrebi tijekom izvođenja. Interni alokator automatski ispunjava zahtjeve za pohranu.
Zašto koristiti std::list?
Ovdje su razlozi korištenja std::List:
- Std::list je bolji u usporedbi s drugim spremnicima niza kao što su polje i vektor.
- Imaju bolju izvedbu u umetanju, pomicanju i izvlačenju elemenata iz bilo kojeg položaja.
- Std::list također radi bolje s algoritmima koji intenzivno izvode takve operacije.
Sintaksa popisa
Da bismo definirali std::list, moramo uvesti datoteka zaglavlja. Ovo je sintaksa definicije std::list:
template < class Type, class Alloc =allocator<T> > class list;
Ovdje je opis gore navedenih parametara:
- T – Definira tip sadržanog elementa. T možete zamijeniti bilo kojim tipom podataka, čak i korisnički definiranim tipovima.
- Alloc – Definira vrstu objekta alokatora. Ovo prema zadanim postavkama koristi predložak klase alokatora. Ovisi o vrijednosti i koristi jednostavan model dodjele memorije.
Primjeri 1
#include <algorithm> #include <iostream> #include <list> int main() { std::list<int> my_list = { 12, 5, 10, 9 }; for (int x : my_list) { std::cout << x << '\n'; } }
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite datoteku zaglavlja algoritma da biste koristili njegove funkcije.
- Uključite datoteku zaglavlja iostream za korištenje njegovih funkcija.
- Uključite datoteku zaglavlja popisa da biste koristili njezine funkcije.
- Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije.
- Napravite popis pod nazivom my_list sa skupom od 4 cijela broja.
- Koristite for petlju za stvaranje varijable petlje x. Ova će se varijabla koristiti za ponavljanje po elementima popisa.
- Ispišite vrijednosti popisa na konzoli.
- Kraj tijela za petlju.
- Kraj tijela funkcije main().
C++ Popis funkcija
Ovo su uobičajene funkcije std::list:
funkcija | Description |
---|---|
umetnuti() | Ova funkcija umeće novu stavku prije pozicije na koju pokazuje iterator. |
odgurnuti() | Ova funkcija dodaje novu stavku na kraj popisa. |
push_front() | Dodaje novu stavku na početak popisa. |
pop_front() | Briše prvu stavku popisa. |
veličina() | Ova funkcija određuje broj elemenata popisa. |
ispred() | Za određivanje prvih stavki popisa. |
leđa() | Za određivanje zadnje stavke popisa. |
obrnuti () | Preokreće stavke popisa. |
sjediniti() | Spaja dvije sortirane liste. |
Konstruktori
Evo popisa Funkcije koje pruža datoteka zaglavlja:
- Zadani konstruktor std::list::list()- Stvara praznu listu, koja ima nula elemenata.
- Konstruktor popune std::list::list()- Stvara popis s n elemenata i dodjeljuje vrijednost nula (0) svakom elementu.
- Konstruktor raspona std::list::list() - stvara popis s mnogo elemenata u rasponu od prvog do zadnjeg.
- Konstruktor kopiranja std::list::list()- Stvara popis s kopijom svakog elementa sadržanog u postojećem popisu.
- Konstruktor pomicanja std::list::list()- stvara popis s elementima drugog popisa koristeći semantiku pomicanja.
- Konstruktor popisa inicijalizatora std::list::list() - Stvara popis s elementima drugog popisa koristeći semantiku pomicanja.
Primjer 2
#include <iostream> #include <list> using namespace std; int main(void) { list<int> l; list<int> l1 = { 10, 20, 30 }; list<int> l2(l1.begin(), l1.end()); list<int> l3(move(l1)); cout << "Size of list l: " << l.size() << endl; cout << "List l2 contents: " << endl; for (auto it = l2.begin(); it != l2.end(); ++it) cout << *it << endl; cout << "List l3 contents: " << endl; for (auto it = l3.begin(); it != l3.end(); ++it) cout << *it << endl; return 0; }
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite datoteku zaglavlja iostream za korištenje njegovih funkcija.
- Uključite datoteku zaglavlja popisa da biste koristili njezine funkcije.
- Uključite prostor imena std u kod da biste koristili njegove klase bez pozivanja.
- Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije.
- Napravite praznu listu pod nazivom l.
- Napravite popis pod nazivom l1 sa skupom od 3 cijela broja.
- Napravite listu pod nazivom l2 sa svim elementima u listi pod nazivom l1, od početka do kraja.
- Napravite popis pod nazivom l3 koristeći semantiku premještanja. Lista l3 će imati isti sadržaj kao i lista l2.
- Ispišite veličinu popisa pod nazivom l na konzoli uz ostali tekst.
- Ispišite tekst na konzoli.
- Napravite iterator pod nazivom it i koristite ga za iteraciju preko elemenata popisa pod nazivom l2.
- Ispišite elemente liste s imenom l2 na konzoli.
- Ispišite tekst na konzoli.
- Napravite iterator pod nazivom it i koristite ga za iteraciju preko elemenata popisa pod nazivom l3.
- Ispišite elemente liste s imenom l3 na konzoli.
- Program mora vratiti vrijednost nakon uspješnog završetka.
- Kraj tijela funkcije main().
Svojstva kontejnera
Ovdje je popis svojstava spremnika:
Svojstvo | Description |
---|---|
Slijed | Spremnici niza poredaju svoje elemente u strogom linearnom nizu. Elementima se pristupa prema njihovom položaju u nizu. |
Dvostruko povezana lista | Svaki element ima informacije o tome kako locirati prethodni i sljedeći element. To omogućuje konstantno vrijeme za operacije umetanja i brisanja. |
Svjestan alokatora | Objekt alokatora koristi se za dinamičku izmjenu veličine pohrane. |
Umetanje u popis
Postoje različite funkcije koje možemo koristiti za umetanje vrijednosti u popis. Pokažimo ovo:
Primjer 3
#include <algorithm> #include <iostream> #include <list> int main() { std::list<int> my_list = { 12, 5, 10, 9 }; my_list.push_front(11); my_list.push_back(18); auto it = std::find(my_list.begin(), my_list.end(), 10); if (it != my_list.end()) { my_list.insert(it, 21); } for (int x : my_list) { std::cout << x << '\n'; } }
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite datoteku zaglavlja algoritma da biste koristili njegove funkcije.
- Uključite datoteku zaglavlja iostream za korištenje njegovih funkcija.
- Uključite datoteku zaglavlja popisa da biste koristili njezine funkcije.
- Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije.
- Napravite popis pod nazivom my_list sa skupom od 4 cijela broja.
- Umetnite element 11 na početak liste pod nazivom my_list.
- Umetnite element 18 na kraj liste pod nazivom my_list.
- Napravite iterator i pomoću njega pronađite element 10 s popisa my_list.
- Upotrijebite naredbu if da odredite je li gornji element pronađen ili ne.
- Umetnite element 21 prije gornjeg elementa ako je pronađen.
- Kraj tijela naredbe if.
- Koristite for petlju za stvaranje varijable petlje x. Ova će se varijabla koristiti za ponavljanje po elementima popisa.
- Ispišite vrijednosti popisa na konzoli.
- Kraj tijela for petlje.
- Kraj tijela funkcije main().
Brisanje s popisa
Moguće je brisati stavke s popisa. Funkcija erase() omogućuje vam brisanje stavke ili niza stavki s popisa.
- Da biste izbrisali jednu stavku, jednostavno proslijedite jedno mjesto cijelog broja. Stavka će biti izbrisana.
- Da biste izbrisali raspon, proslijedite početni i završni iterator. Pokažimo ovo.
Primjer 4
#include <algorithm> #include <iostream> #include <list> using namespace std; int main() { std::list<int> my_list = { 12, 5, 10, 9 }; cout << "List elements before deletion: "; for (int x : my_list) { std::cout << x << '\n'; } list<int>::iterator i = my_list.begin(); my_list.erase(i); cout << "\nList elements after deletion: "; for (int x : my_list) { std::cout << x << '\n'; } return 0; }
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite datoteku zaglavlja algoritma da biste koristili njegove funkcije.
- Uključite datoteku zaglavlja iostream za korištenje njegovih funkcija.
- Uključite datoteku zaglavlja popisa da biste koristili njezine funkcije.
- Uključite prostor imena std u naš program kako biste koristili njegove klase bez pozivanja.
- Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije.
- Napravite popis pod nazivom my_list sa skupom od 4 cijela broja.
- Ispišite tekst na konzoli.
- Koristite for petlju za stvaranje varijable petlje x. Ova će se varijabla koristiti za ponavljanje po elementima popisa.
- Ispišite vrijednosti popisa na konzoli.
- Kraj tijela for petlje.
- Napravite iterator i koji pokazuje na prvi element liste.
- Koristite funkciju erase() na koju ukazuje iterator i.
- Ispišite tekst na konzoli.
- Koristite for petlju za stvaranje varijable petlje x. Ova će se varijabla koristiti za ponavljanje po elementima popisa.
- Ispišite vrijednosti popisa na konzoli. Ovo dolazi nakon brisanja.
- Kraj tijela for petlje.
- Program mora vratiti vrijednost nakon uspješnog završetka.
- Kraj tijela funkcije main().
rezime
- Std::list je spremnik za pohranu.
- Omogućuje umetanje i brisanje stavki s bilo kojeg mjesta u stalnom vremenu.
- Implementiran je kao dvostruka veza
- Podacima std::list može se pristupiti dvosmjerno i sekvencijalno.
- std::list ne podržava brzi nasumični pristup. Međutim, podržava sekvencijalni pristup iz svih smjerova.
- Elemente popisa std::list možete razbacati u različite memorijske dijelove.
- Možete smanjiti ili proširiti std::list s oba kraja prema potrebi tijekom izvođenja.
- Za umetanje stavki u std::list koristimo funkciju insert().
- Za brisanje stavki sa std::list koristimo funkciju erase().