std::list in C++ példával
⚡ Okos összefoglaló
std::list in C++ egy kétszeresen láncolt listaként megvalósított szekvenciakonténer, amely lehetővé teszi a gyors beszúrást és törlést bármely pozícióban, miközben az elemeket nem összefüggő memóriában tárolja, és a véletlenszerű hozzáférés helyett kétirányú szekvenciális hozzáférést támogat.

Mi az std::list?
In C++, az std::list egy tárolókonténerre utal. Az std::list lehetővé teszi elemek beszúrását és eltávolítását bárhonnan. Az std::list duplán linkelt listaként van megvalósítva. Ez azt jelenti, hogy a listaadatok kétirányúan és szekvenciálisan é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.
Ezek a tulajdonságok egy gyakorlati kérdést vetnek fel: mikor kell valójában listához nyúlni?
Miért érdemes az std::list-et használni?
Íme az std::list használatának okai:
- Az std::list jobban teljesít más szekvenciatárolókhoz, mint például az array és a vector.
- Jobb teljesítményt nyújtanak a behelyezés, mozgatás és kijuttatás terén.tracelemek bármilyen pozícióból.
- Az std::list az ilyen műveleteket intenzíven végrehajtó algoritmusokkal is jobban teljesít.
Miután az okok tisztázódtak, a következő lépés a deklaráló szintaxis.
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 benne foglalt elem típusát. A T-t bármilyen adattípussal helyettesítheti, akár 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 egy egyszerű memória-allokációs modellt használ.
Példa 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'; } }
output:
Itt van egy képernyőkép a kódról:
Code Magyarázat:
- Tartalmazza az algoritmus fejlécfájlját a funkcióinak használatához.
- Tartalmazza az iostream fejlécfájlt a funkcióinak használatához.
- Tartalmazza a listafejléc fájlt a funkcióinak használatához.
- Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
- Hozzon létre egy listát my_list néven 4 egész szám halmazával.
- Használat hurokhoz egy x ciklusváltozó létrehozása. Ezt a változót fogjuk használni a listaelemek végigjárására.
- Nyomtassa ki a lista értékeit a konzolon.
- A for ciklus törzsének vége.
- 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:
Itt van egy képernyőkép a kódról:
Code Magyarázat:
- Tartalmazza az iostream fejlécfájlt a funkcióinak használatához.
- Tartalmazza a listafejléc fájlt a funkcióinak használatához.
- Szerelje be az std névteret a kódba, hogy az osztályait hívás nélkül használja.
- Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
- Hozzon létre egy üres listát l néven.
- Hozzon létre egy l1 nevű listát 3 egész szám halmazával.
- Hozzon létre egy l2 nevű listát az l1 nevű lista minden elemével az elejétől a végéig.
- 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.
- Nyomtassa ki az l nevű lista méretét a konzolon a többi szöveg mellé.
- Nyomtasson szöveget a konzolra.
- Hozzon létre egy iterátor nevű iterátort, és használja azt az l2 nevű lista elemei közötti iterációhoz.
- Nyomtassa ki az l2 nevű lista elemeit a konzolon.
- Nyomtasson szöveget a konzolra.
- Hozzon létre egy iterátor nevű iterátort, és használja azt az l3 nevű lista elemei közötti iterációhoz.
- Nyomtassa ki az l3 nevű lista elemeit a konzolon.
- A programnak értéket kell visszaadnia a sikeres befejezés után.
- 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önböző függvényekkel tudunk értékeket beszúrni egy listába. Nézzük 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:
Itt van egy képernyőkép a kódról:
Code Magyarázat:
- Tartalmazza az algoritmus fejlécfájlját a funkcióinak használatához.
- Tartalmazza az iostream fejlécfájlt a funkcióinak használatához.
- Tartalmazza a listafejléc fájlt a funkcióinak használatához.
- Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
- Hozzon létre egy listát my_list néven 4 egész szám halmazával.
- Illessze be a 11-es elemet a my_list nevű lista elejére.
- Szúrja be a 18-as elemet a my_list nevű lista végére.
- Hozzon létre egy iterátort, és keresse meg vele a 10-es elemet a my_list listából.
- Használjon if utasítást annak meghatározására, hogy a fenti elem megtalálható-e vagy sem.
- Szúrja be a 21-es elemet a fenti elem elé, ha megtalálta.
- Az if utasítás törzsének vége.
- 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.
- Nyomtassa ki a lista értékeit a konzolon.
- A for hurok törzsének vége.
- A main() függvény törzsének vége.
A listába kerülő elemek ugyanolyan könnyen eltávolíthatók.
Törlés listából
Lehetséges elemeket törölni egy listából. Az erase() függvény lehetővé teszi egy elem vagy elemtartomány törlését egy 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 átadjuk a kezdő és a záró iterátorokat. Nézzük 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:
Itt van egy képernyőkép a kódról:
Code Magyarázat:
- Tartalmazza az algoritmus fejlécfájlját a funkcióinak használatához.
- Tartalmazza az iostream fejlécfájlt a funkcióinak használatához.
- Tartalmazza a listafejléc fájlt a funkcióinak használatához.
- Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
- Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
- Hozzon létre egy listát my_list néven 4 egész szám halmazával.
- Nyomtasson szöveget a konzolra.
- 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.
- Nyomtassa ki a lista értékeit a konzolon.
- A for ciklus törzsének vége.
- Hozzon létre egy iterátort i, amely a lista első elemére mutat.
- Használja az erase() függvényt, amelyet az iterátor i.
- Nyomtasson szöveget a konzolra.
- 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.
- Nyomtassa ki a lista értékeit a konzolon. Ez a törlés után következik be.
- A for ciklus törzsének vége.
- A programnak értéket kell visszaadnia a sikeres befejezés után.
- A main() függvény törzsének vége.






