std::list in C++ példával

Mi az std::list?

In C++, az std::lista egy tárolótárolóra utal. Az std:list lehetővé teszi az elemek beszúrását és eltávolítását bárhonnan. Az std::list duplán linkelt listaként valósul meg. Ez azt jelenti, hogy a listaadatok kétirányú és szekvenciális módon érhetők el.

A Standard Template Library lista nem támogatja a gyors véletlenszerű hozzáférést, de támogatja a szekvenciális hozzáférést minden irányból.

A listaelemeket szétszórhatja különböző memóriadarabokban. Az adatok szekvenciális eléréséhez szükséges információkat egy tárolóban tárolják. Az std::list mindkét végéről szükség szerint bővülhet és zsugorodhat futás közben. A belső elosztó automatikusan teljesíti a tárolási követelményeket.

Miért érdemes az std::list-et használni?

Itt van az std::List használatának oka:

  • Az std::list jobban összehasonlítható más szekvenciatárolókkal, mint például a tömb és a vektor.
  • Jobb teljesítményt nyújtanak az elemek behelyezésében, mozgatásakor és bármilyen pozícióból történő kihúzásában.
  • Az std::list az ilyen műveleteket intenzíven végrehajtó algoritmusokkal is jobban teljesít.

Lista szintaxis

Az std::list meghatározásához importálnunk kell a fejléc fájl. Íme az std::list definíció szintaxisa:

template < class Type, class Alloc =allocator<T> > class list;

Itt található a fenti paraméterek leírása:

  • T – Meghatározza a tartalmazott elem típusát. A T-t bármilyen adattípussal helyettesítheti, még a felhasználó által definiált típusokkal is.
  • Alloc – Meghatározza az allokátor objektum típusát. Ez alapértelmezés szerint az allokátor osztálysablont használja. Értékfüggő, és egyszerű memóriafoglalási modellt használ.

1. példa

#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';
	}
}

output:

std::list

Itt van egy képernyőkép a kódról:

std::list

Kód magyarázata:

  1. Tartalmazza az algoritmus fejlécfájlját a funkcióinak használatához.
  2. Tartalmazza az iostream fejlécfájlt a funkcióinak használatához.
  3. Tartalmazza a listafejléc fájlt a funkcióinak használatához.
  4. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
  5. Hozzon létre egy listát my_list néven 4 egész szám halmazával.
  6. Használja a for ciklust egy x ciklusváltozó létrehozásához. Ez a változó a listaelemek közötti iterációra szolgál.
  7. Nyomtassa ki a lista értékeit a konzolon.
  8. A test vége a hurokhoz.
  9. A main() függvény törzsének vége.

C++ Funkciók listája

Íme a gyakori std::list függvények:

Funkció Leírás
beillesztés () Ez a funkció egy új elemet szúr be az iterátor által mutatott pozíció elé.
visszavet() Ez a funkció új elemet ad a lista végére.
push_front() Új elemet ad a lista elejére.
pop_front() Törli a lista első elemét.
méret () Ez a függvény határozza meg a listaelemek számát.
elülső() Meghatározza a lista első elemeit.
vissza() A lista utolsó elemét határozza meg.
fordított () Megfordítja a listaelemeket.
összeolvad() Két rendezett listát egyesít.

Konstruktorok

Itt van a lista funkciók által biztosított fejléc fájl:

  • Alapértelmezett konstruktor std::list::list()- Egy üres listát hoz létre, amely nulla elemmel.
  • Fill konstruktor std::list::list()- Létrehoz egy listát n elemből, és minden elemhez nulla (0) értéket rendel.
  • Tartománykonstruktor std::list::list()- olyan listát hoz létre, amely sok elemet tartalmaz az elsőtől az utolsóig terjedő tartományban.
  • Konstruktor másolása std::list::list()- Létrehoz egy listát a meglévő lista minden elemének másolatával.
  • Move konstruktor std::list::list()- egy listát hoz létre egy másik lista elemeivel a mozgatási szemantika segítségével.
  • Inicializáló listakonstruktor std::list::list()-Létrehoz egy listát egy másik lista elemeivel a mozgatási szemantika segítségével.

Példa 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;
}

output:

Konstruktorok listája

Itt van egy képernyőkép a kódról:

Konstruktorok listája

Kód magyarázata:

  1. Tartalmazza az iostream fejlécfájlt a funkcióinak használatához.
  2. Tartalmazza a listafejléc fájlt a funkcióinak használatához.
  3. Szerelje be az std névteret a kódba, hogy az osztályait hívás nélkül használja.
  4. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
  5. Hozzon létre egy üres listát l néven.
  6. Hozzon létre egy l1 nevű listát 3 egész szám halmazával.
  7. Hozzon létre egy l2 nevű listát az l1 nevű lista minden elemével az elejétől a végéig.
  8. Hozzon létre egy l3 nevű listát a mozgatási szemantika segítségével. Az l3 lista tartalma megegyezik az l2 listával.
  9. Nyomtassa ki az l nevű lista méretét a konzolon a többi szöveg mellé.
  10. Nyomtasson szöveget a konzolra.
  11. Hozzon létre egy iterátor nevű iterátort, és használja azt az l2 nevű lista elemei közötti iterációhoz.
  12. Nyomtassa ki az l2 nevű lista elemeit a konzolon.
  13. Nyomtasson szöveget a konzolra.
  14. Hozzon létre egy iterátor nevű iterátort, és használja azt az l3 nevű lista elemei közötti iterációhoz.
  15. Nyomtassa ki az l3 nevű lista elemeit a konzolon.
  16. A programnak értéket kell visszaadnia a sikeres befejezés után.
  17. A main() függvény törzsének vége.

Konténer tulajdonságai

Íme a tároló tulajdonságainak listája:

Ingatlanok Leírás
Sorozat A szekvenciatárolók elemeiket szigorú lineáris sorrendbe rendezik. Az elemek a sorrendben elfoglalt helyük alapján érhetők el.
Duplán linkelt lista Minden elem rendelkezik információkkal az előző és a következő elemek megkereséséhez. Ez állandó időt biztosít a beillesztési és törlési műveletekhez.
Kiosztó-tudatos Egy allokátor objektum a tárolóméret dinamikus módosítására szolgál.

Beszúrás egy listába

Különféle függvények segítségével tudunk értékeket beszúrni egy listába. Mutassuk meg ezt:

Példa 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';
	}
}

output:

Beszúrás egy listába

Itt van egy képernyőkép a kódról:

Beszúrás egy listába

Kód magyarázata:

  1. Tartalmazza az algoritmus fejlécfájlját a funkcióinak használatához.
  2. Tartalmazza az iostream fejlécfájlt a funkcióinak használatához.
  3. Tartalmazza a listafejléc fájlt a funkcióinak használatához.
  4. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
  5. Hozzon létre egy listát my_list néven 4 egész szám halmazával.
  6. Illessze be a 11-es elemet a my_list nevű lista elejére.
  7. Szúrja be a 18-as elemet a my_list nevű lista végére.
  8. Hozzon létre egy iterátort, és keresse meg vele a 10-es elemet a my_list listából.
  9. Használjon if utasítást annak meghatározására, hogy a fenti elem megtalálható-e vagy sem.
  10. Szúrja be a 21-es elemet a fenti elem elé, ha megtalálta.
  11. Az if utasítás törzsének vége.
  12. Használja a for ciklust egy x ciklusváltozó létrehozásához. Ez a változó a listaelemek közötti iterációra szolgál.
  13. Nyomtassa ki a lista értékeit a konzolon.
  14. A for hurok törzsének vége.
  15. A main() függvény törzsének vége.

Törlés listából

Lehetőség van elemek törlésére a listából. Az erase() függvény lehetővé teszi egy elem vagy elemtartomány törlését a listából.

  • Egyetlen elem törléséhez egyszerűen adjon meg egy egész számot. Az elem törlésre kerül.
  • Egy tartomány törléséhez át kell adni a kezdő és a záró iterátort. Mutassuk meg ezt.

Példa 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;
}

output:

Törlés listából

Itt van a kód képernyőképe:

Törlés listából

Kód magyarázata:

  1. Tartalmazza az algoritmus fejlécfájlját a funkcióinak használatához.
  2. Tartalmazza az iostream fejlécfájlt a funkcióinak használatához.
  3. Tartalmazza a listafejléc fájlt a funkcióinak használatához.
  4. Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
  5. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
  6. Hozzon létre egy listát my_list néven 4 egész szám halmazával.
  7. Nyomtasson szöveget a konzolra.
  8. Használja a for ciklust egy x ciklusváltozó létrehozásához. Ez a változó a listaelemek közötti iterációra szolgál.
  9. Nyomtassa ki a lista értékeit a konzolon.
  10. A for ciklus törzsének vége.
  11. Hozzon létre egy iterátort i, amely a lista első elemére mutat.
  12. Használja az erase() függvényt, amelyet az iterátor i.
  13. Nyomtasson szöveget a konzolra.
  14. Használja a for ciklust egy x ciklusváltozó létrehozásához. Ez a változó a listaelemek közötti iterációra szolgál.
  15. Nyomtassa ki a lista értékeit a konzolon. Ez a törlés után következik be.
  16. A for ciklus törzsének vége.
  17. A programnak értéket kell visszaadnia a sikeres befejezés után.
  18. A main() függvény törzsének vége.

Összegzésként

  • Az std::list egy tárolótároló.
  • Lehetővé teszi az elemek beszúrását és törlését bárhonnan, állandó időben.
  • Dupla kapcsolatként valósul meg
  • Az std::list adatok két irányban és szekvenciálisan érhetők el.
  • std::list nem támogatja a gyors véletlenszerű hozzáférést. Ugyanakkor támogatja a szekvenciális hozzáférést minden irányból.
  • Az std::list listaelemeit szétszórhatja különböző memóriadarabokban.
  • Az std::list mindkét végéről szükség szerint szűkíthető vagy bővíthető futás közben.
  • Az elemek beszúrásához az std::list-be az insert() függvényt használjuk.
  • Az std::list elemeinek törléséhez az erase() függvényt használjuk.