lists stl
Seznamte se se všemi seznamy v STK a jejich implementací.
Seznamy jsou sekvenční kontejnery. Seznamy obsahují prvky na nesouvislých místech. V minulých cvičeních jsme diskutovali o polích a vektorech.
V případě kontejnerů pole a vektorů, protože tyto kontejnery ukládají data do souvislé paměti, se operace vložení uprostřed těchto kontejnerů ukazuje jako velmi nákladná, protože musíme odpovídajícím způsobem posunout existující prvky, aby se vytvořil prostor pro nový prvek.
=> Prohlédněte si úplný seznam výukových programů C ++ zde.
rozdíl mezi spuštěním portu a přesměrováním portů
Co se naučíte:
Přehled
Seznam je kontejner, který překonává tuto nevýhodu kontejnerů pole a vektorů. Umožňuje nám vložit prvky kamkoli do seznamu, aniž by to způsobilo velkou režii. Seznamy jsou ale pomalejší než vektory, pokud jde o průchod.
V tomto kurzu uvidíme implementaci seznamů v STL spolu s různými operacemi procházení, manipulací a přístupu k seznamu s příklady.
Všimněte si, že většina operací seznamu je podobná operacím vektorů, a proto čtenáři, kteří si již přečetli náš tutoriál vektorů, nebudou mít problémy s interpretací konceptů seznamu.
Prohlášení a inicializace
Pro implementaci seznamu kontejneru a využití všech jeho výhod musíme do našeho programu zahrnout soubor záhlaví.
#include
Obecné prohlášení pro seznamový kontejner je
std::list listName;
Například,můžeme deklarovat seznam s názvem „mylist“ typu int takto:
std::list mylist;
Můžeme také inicializovat seznam v době deklarace nebo do něj přidat prvky pomocí jedné z operací, které podporuje.
Podívejme se, jak můžeme inicializovat seznam, který jsme vytvořili výše.
std::list mylist = {1, 1, 2, 3, 5};
Výše uvedená inicializace bude uložena v paměti, jak je znázorněno níže:
Jakmile inicializujeme seznam, můžeme přistupovat k prvkům seznamu pomocí iterátoru. Funkce iterátoru „začátek“ a „konec“ nám pomáhají procházet prvky seznamu.
Poznámka: Iterátor pro seznam také podporuje další iterátory, jako jsou reverzní iterátory (rbegin, rend), konstantní iterátory (cbegin, cend) a konstantní reverzní iterátory (crbegin, crend) a lze je použít podobným způsobem jako vektory.
Následující příklad to ukazuje.
#include #include #include #include using namespace std; int main() { list mylist = {1, 1, 2, 3, 5}; cout<<”List elements are: “; list::iterator it; for(it=mylist.begin();it!=mylist.end();++it) cout<<*it<<” “; }
Výstup:
Prvky seznamu jsou: 1 1 2 3 5
Ve výše uvedeném příkladu jsme tedy deklarovali seznam Fibonacciho sekvence. Dále deklarujeme iterátor stejného typu jako seznam a pomocí smyčky for vytiskneme obsah seznamu od začátku do konce.
Nyní přejdeme k operacím nebo funkcím, které nám poskytuje seznam kontejnerů v STL.
Seznam operací
- Vložit: Slouží k vložení prvku na danou pozici. Vrátí iterátor ukazující na první vložený prvek.
insert (pos, num_elem, elem)
Kde,
pos => Poloha, ve které mají být vloženy nové prvky.
num_elem => Počet vložených prvků; výchozí hodnota 1.
item => Skutečná hodnota, která se má vložit.
Pojďme pochopit funkci vložení pomocí příkladu.
#include #include // for list operations using namespace std; int main() { list mylist = {1,1,2}; list::iterator it = mylist.begin(); // iterator to point to 4th position advance(it,` 3); // inserts 3 at 4th position mylist.insert(it, 3); cout << 'The list after inserting' << ' 1 element using insert() is : '; for (list::iterator i = mylist.begin();i != mylist.end();i++) cout << *i << ' '; cout << endl; }
Výstup:
Seznam po vložení 1 prvku pomocí insert () je: 1 1 2 3
Toto je příklad pro vložení pouze jednoho prvku na 4thpozice v seznamu, která je nakonec poslední pozicí. Nejprve tedy máme seznam, pro který jsme definovali iterátor směřující na začátek seznamu. Poté posuneme tento iterátor na 4thpozici a poté zavoláním insert vložte 1 prvek.
Můžeme také vložit více než jeden prvek zadáním druhého parametru ve funkci vložení. Kdykoli není zadán, je výchozí hodnota 1.
- zatlačit zpátky :Přidá nový prvek na konec seznamu.
- push_front :Přidá nový prvek na začátek seznamu.
Podívejme se na příklad, který ukazuje použití funkcí push_back a push_front.
#include #include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3}; cout<<'List elements are: '; printlist(mylist); mylist.push_front(0); mylist.push_back(5); cout<<'
List contents after push_front and push_back: '; printlist(mylist); }
Výstup:
Prvky seznamu jsou: 1 1 2 3
Seznam obsahu po push_front a push_back: 0 1 1 2 3 5
V tomto příkladu nejprve vytvoříme a vypsáme všechny dva prvky, jeden každý zepředu a zezadu pomocí funkcí push_front a push_back. Výstup zobrazí změněný seznam po provedení obou funkcí.
- pop_back :Odebere poslední prvek v seznamu, čímž zmenší velikost seznamu o 1.
- pop_front :Odebere první prvek v seznamu, čímž zmenší velikost seznamu o 1.
Následující příklad ukazuje použití operací pop_back a pop_front seznamu.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); mylist.pop_front(); mylist.pop_back(); cout<<'
List contents after push_front and push_back: '; printlist(mylist); }
Výstup:
Prvky seznamu jsou: 1 1 2 3 5
Seznam obsahu po push_front a push_back: 1 2 3
Jak je popsáno v definici operací, každá z operací pop_front a pop_back odstraní prvek z přední a zadní části seznamu, tj. Prvního a posledního prvku seznamu, a tedy pokaždé, když zmenší velikost seznamu o 1.
- velikost :Vrátí velikost seznamu, tj. Počet prvků v seznamu.
- prázdný :Zkontroluje, zda je seznam prázdný.
- vymazat :Odebere prvek nebo rozsah prvků ze seznamu.
- Průhledná :Odebere všechny prvky ze seznamu tak, že je nastaví na 0.
Níže je uveden příklad, který demonstruje použití všech výše uvedených funkcí, tj. Velikosti, prázdné, vymazat a vymazat.
nejlepší způsob, jak převést youtube na mp4
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); cout<<'size of the list: '< Výstup:
Prvky seznamu jsou: 1 1 2 3 5
velikost seznamu: 5
Seznam po vymazání prvního prvku: 1 2 3 5
Nová velikost seznamu: 4
velikost seznamu po vymazání: 0
Výše uvedený program demonstruje všechny čtyři funkce související s kapacitou seznamu. Vidíme, že velikost seznamu se zmenší o 1, když vymažeme 1 prvek seznamu. Zatímco když v seznamu voláme jasnou operaci, velikost je 0, což znamená, že jsou odstraněny všechny prvky v seznamu.
- přední :Vrátí hodnotu prvního prvku seznamu.
- zadní :Vrátí hodnotu posledního prvku seznamu.
- vyměnit :Zamění obsah jednoho seznamu za obsah jiného seznamu stejné velikosti a typu.
- zvrátit :Algoritmus, který obrátí seznam.
- třídit :Seřadí daný seznam.
Níže uvedený příklad ukazuje použití funkcí vpředu, vzadu, vzad, řazení a výměny.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); cout<<'
Front of the list: '< Výstup:
Prvky seznamu jsou: 1 1 2 3 5
Přední část seznamu: 1
Zpět na seznam: 5
Obrácený seznam: 5 3 2 1 1
Obsah lichého seznamu: 1 3 5 7 9
Po výměně
mylist: 1 3 5 7 9
Zvláštní seznam: 5 3 2 1 1
V tomto kódu nejprve vytiskneme přední a zadní hodnoty seznamu mylist. Pak je tento seznam obrácen a obrácený seznam je vytištěn. Poté definujeme ještě jeden seznam lichých čísel, který není v žádném pořadí, a pro seřazení tohoto seznamu voláme algoritmus „Třídění“. Poté oba seznamy vyměníme pomocí funkce swap a vytištěné seznamy vytiskneme.
- spojit :Tato funkce se používá k přenosu obsahu jednoho seznamu do jiného seznamu na určené pozici.
Oba seznamy musí být stejného typu.
spoj (pozice, seznam);
kde,
position => Poloha, na kterou má být přenesen obsah seznamu.
list => Seznam, jehož prvky mají být přeneseny.
Níže uvedený příklad ukazuje použití funkce spojování.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 8,13}; cout<<'List elements are: '; printlist(mylist); list seclist = {2,3,5}; cout<<'list to be spliced: '; printlist(seclist); list:: iterator it = mylist.begin(); it ++; it++; mylist.splice(it,seclist); cout<<'
List contents after splicing at position 2: '; printlist(mylist); }
Výstup:
Prvky seznamu jsou: 1 1 8 13
seznam k sestřihu: 2 3 5
Seznamte obsah po sestřihu na pozici 2: 1 1 2 3 5 8 13
The příklad ukazuje, že používáme dva seznamy. Nejprve se iterátor pro mylist přesune do dvou pozic a poté se vyvolá funkce spojování k přenosu obsahu druhého seznamu na třetí pozici prvního seznamu.
- jít :Na rozdíl od funkce spojování, kterou lze použít k přenosu obsahu jednoho seznamu do druhého na určité pozici, operace sloučení přímo sloučí dva seznamy a vytvoří jeden jediný seznam. Pro operaci sloučení musí být oba seznamy seřazeny v seřazeném pořadí.
Níže je uveden příklad demonstrace funkce sloučení.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1,2,3,5,8}; list seclist = {4,6,7}; cout<<'First List: '; printlist(mylist); cout< Výstup:
První seznam: 11 2 3 5 8
Druhý seznam: 4 6 7
Obsah seznamu po sloučení dvou seznamů:
1 1 2 3 4 5 6 7 8
Ve výše uvedeném programu tedy máme dva seznamy, které jsou seřazeny. Na těchto dvou seznamech nazýváme slučovací operaci. Výsledný seznam je seřazený seznam obsahující prvky obou seznamů.
Závěr
Přišli jsme na konec tohoto tutoriálu Seznamy v STL. Doufáme, že vám tento výukový program poskytne obrovské znalosti o Seznamech v STL.
=> Podívejte se sem a podívejte se zde na A-Z výukových kurzů C ++.
Doporučené čtení