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:
Itt van egy képernyőkép a kódról:
Kód magyarázata:
- 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á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 test vége a hurokhoz.
- 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:
Kód magyarázata:
- 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ö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:
Itt van egy képernyőkép a kódról:
Kód magyarázata:
- 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.
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:
Itt van a kód képernyőképe:
Kód magyarázata:
- 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.
Ö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.