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:

std::list

Evo snimke zaslona koda:

std::list

Objašnjenje koda:

  1. Uključite datoteku zaglavlja algoritma da biste koristili njegove funkcije.
  2. Uključite datoteku zaglavlja iostream za korištenje njegovih funkcija.
  3. Uključite datoteku zaglavlja popisa da biste koristili njezine funkcije.
  4. Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije.
  5. Napravite popis pod nazivom my_list sa skupom od 4 cijela broja.
  6. Koristite for petlju za stvaranje varijable petlje x. Ova će se varijabla koristiti za ponavljanje po elementima popisa.
  7. Ispišite vrijednosti popisa na konzoli.
  8. Kraj tijela za petlju.
  9. 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:

Konstruktori popisa

Evo snimke zaslona koda:

Konstruktori popisa

Objašnjenje koda:

  1. Uključite datoteku zaglavlja iostream za korištenje njegovih funkcija.
  2. Uključite datoteku zaglavlja popisa da biste koristili njezine funkcije.
  3. Uključite prostor imena std u kod da biste koristili njegove klase bez pozivanja.
  4. Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije.
  5. Napravite praznu listu pod nazivom l.
  6. Napravite popis pod nazivom l1 sa skupom od 3 cijela broja.
  7. Napravite listu pod nazivom l2 sa svim elementima u listi pod nazivom l1, od početka do kraja.
  8. Napravite popis pod nazivom l3 koristeći semantiku premještanja. Lista l3 će imati isti sadržaj kao i lista l2.
  9. Ispišite veličinu popisa pod nazivom l na konzoli uz ostali tekst.
  10. Ispišite tekst na konzoli.
  11. Napravite iterator pod nazivom it i koristite ga za iteraciju preko elemenata popisa pod nazivom l2.
  12. Ispišite elemente liste s imenom l2 na konzoli.
  13. Ispišite tekst na konzoli.
  14. Napravite iterator pod nazivom it i koristite ga za iteraciju preko elemenata popisa pod nazivom l3.
  15. Ispišite elemente liste s imenom l3 na konzoli.
  16. Program mora vratiti vrijednost nakon uspješnog završetka.
  17. 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:

Umetanje u popis

Evo snimke zaslona koda:

Umetanje u popis

Objašnjenje koda:

  1. Uključite datoteku zaglavlja algoritma da biste koristili njegove funkcije.
  2. Uključite datoteku zaglavlja iostream za korištenje njegovih funkcija.
  3. Uključite datoteku zaglavlja popisa da biste koristili njezine funkcije.
  4. Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije.
  5. Napravite popis pod nazivom my_list sa skupom od 4 cijela broja.
  6. Umetnite element 11 na početak liste pod nazivom my_list.
  7. Umetnite element 18 na kraj liste pod nazivom my_list.
  8. Napravite iterator i pomoću njega pronađite element 10 s popisa my_list.
  9. Upotrijebite naredbu if da odredite je li gornji element pronađen ili ne.
  10. Umetnite element 21 prije gornjeg elementa ako je pronađen.
  11. Kraj tijela naredbe if.
  12. Koristite for petlju za stvaranje varijable petlje x. Ova će se varijabla koristiti za ponavljanje po elementima popisa.
  13. Ispišite vrijednosti popisa na konzoli.
  14. Kraj tijela for petlje.
  15. 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:

Brisanje s popisa

Evo snimke zaslona koda:

Brisanje s popisa

Objašnjenje koda:

  1. Uključite datoteku zaglavlja algoritma da biste koristili njegove funkcije.
  2. Uključite datoteku zaglavlja iostream za korištenje njegovih funkcija.
  3. Uključite datoteku zaglavlja popisa da biste koristili njezine funkcije.
  4. Uključite prostor imena std u naš program kako biste koristili njegove klase bez pozivanja.
  5. Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije.
  6. Napravite popis pod nazivom my_list sa skupom od 4 cijela broja.
  7. Ispišite tekst na konzoli.
  8. Koristite for petlju za stvaranje varijable petlje x. Ova će se varijabla koristiti za ponavljanje po elementima popisa.
  9. Ispišite vrijednosti popisa na konzoli.
  10. Kraj tijela for petlje.
  11. Napravite iterator i koji pokazuje na prvi element liste.
  12. Koristite funkciju erase() na koju ukazuje iterator i.
  13. Ispišite tekst na konzoli.
  14. Koristite for petlju za stvaranje varijable petlje x. Ova će se varijabla koristiti za ponavljanje po elementima popisa.
  15. Ispišite vrijednosti popisa na konzoli. Ovo dolazi nakon brisanja.
  16. Kraj tijela for petlje.
  17. Program mora vratiti vrijednost nakon uspješnog završetka.
  18. 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().