std::seznam v C++ s příkladem
Co je to std::list?
In C++, std::list odkazuje na úložný kontejner. Std:list umožňuje vkládat a odebírat položky odkudkoli. std::list je implementován jako dvojitě propojený seznam. To znamená, že k datům seznamu lze přistupovat obousměrně a sekvenčně.
Seznam Standardní knihovna šablon nepodporuje rychlý náhodný přístup, ale podporuje sekvenční přístup ze všech směrů.
Prvky seznamu můžete rozptýlit do různých částí paměti. Informace potřebné pro sekvenční přístup k datům jsou uloženy v kontejneru. Seznam std::list se může během běhu podle potřeby rozšiřovat a zmenšovat z obou konců. Interní alokátor automaticky splňuje požadavky na úložiště.
Proč používat std::list?
Zde jsou důvody použití std::List:
- Std::list je na tom lépe ve srovnání s jinými sekvenčními kontejnery, jako je pole a vektor.
- Mají lepší výkon při vkládání, přesouvání a vyjímání prvků z libovolné pozice.
- Std::list si také vede lépe s algoritmy, které tyto operace provádějí intenzivně.
Syntaxe seznamu
Chcete-li definovat std::list, musíme importovat hlavičkový soubor. Zde je syntaxe definice std::list:
template < class Type, class Alloc =allocator<T> > class list;
Zde je popis výše uvedených parametrů:
- T – Definuje typ obsaženého prvku. T můžete nahradit libovolným datovým typem, dokonce i uživatelsky definovanými typy.
- Alloc – Definuje typ objektu alokátoru. Ve výchozím nastavení používá šablonu třídy alokátoru. Je závislý na hodnotě a používá jednoduchý model alokace paměti.
Příklady 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'; } }
Výstup:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte soubor záhlaví algoritmu.
- Chcete-li používat jeho funkce, zahrňte soubor záhlaví iostream.
- Chcete-li používat jeho funkce, zahrňte soubor záhlaví seznamu.
- Zavolejte funkci main(). Programová logika by měla být přidána do těla této funkce.
- Vytvořte seznam s názvem můj_seznam se sadou 4 celých čísel.
- Pomocí cyklu for vytvořte proměnnou x cyklu. Tato proměnná bude použita k iteraci prvků seznamu.
- Vytiskněte hodnoty seznamu na konzole.
- Konec těla pro smyčku.
- Konec těla funkce main().
C++ Seznam funkcí
Zde jsou běžné funkce std::list:
funkce | Description |
---|---|
vložit() | Tato funkce vloží novou položku před pozici, na kterou ukazuje iterátor. |
zatlačit zpátky() | Tato funkce přidá novou položku na konec seznamu. |
push_front() | Přidá novou položku na začátek seznamu. |
pop_front() | Smaže první položku seznamu. |
velikost() | Tato funkce určuje počet prvků seznamu. |
přední() | To určuje první položky seznamu. |
zadní() | To určuje poslední položku seznamu. |
zvrátit() | Obrátí položky seznamu. |
spojit() | Sloučí dva seřazené seznamy. |
Konstruktéři
Zde je seznam funkce poskytuje hlavičkový soubor:
- Výchozí konstruktor std::list::list()- Vytvoří prázdný seznam, který nemá žádné prvky.
- Konstruktor výplně std::list::list()- Vytvoří seznam s n prvky a každému prvku přiřadí hodnotu nula (0).
- Konstruktor rozsahu std::list::list()- vytváří seznam s mnoha prvky v rozsahu od prvního do posledního.
- Kopírovat konstruktor std::list::list()- Vytvoří seznam s kopií každého prvku obsaženého v existujícím seznamu.
- Konstruktor přesunu std::list::list()- vytvoří seznam s prvky jiného seznamu pomocí sémantiky přesunu.
- Konstruktor seznamu inicializátoru std::list::list()-Vytváří seznam s prvky jiného seznamu pomocí sémantiky přesunu.
Příklad 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; }
Výstup:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte soubor záhlaví iostream.
- Chcete-li používat jeho funkce, zahrňte soubor záhlaví seznamu.
- Zahrňte do kódu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
- Zavolejte funkci main(). Programová logika by měla být přidána do těla této funkce.
- Vytvořte prázdný seznam s názvem l.
- Vytvořte seznam s názvem l1 se sadou 3 celých čísel.
- Vytvořte seznam s názvem l2 se všemi prvky v seznamu s názvem l1, od začátku do konce.
- Vytvořte seznam s názvem l3 pomocí sémantiky přesunu. Seznam l3 bude mít stejný obsah jako seznam l2.
- Vytiskněte velikost seznamu s názvem l na konzole vedle jiného textu.
- Vytiskněte nějaký text na konzoli.
- Vytvořte iterátor s názvem a použijte jej k iteraci prvků seznamu s názvem l2.
- Vytiskněte prvky seznamu s názvem l2 na konzole.
- Vytiskněte nějaký text na konzoli.
- Vytvořte iterátor s názvem a použijte jej k iteraci prvků seznamu s názvem l3.
- Vytiskněte prvky seznamu s názvem l3 na konzole.
- Program musí po úspěšném dokončení vrátit hodnotu.
- Konec těla funkce main().
Vlastnosti kontejneru
Zde je seznam vlastností kontejneru:
Vlastnictví | Description |
---|---|
Sekvence | Sekvenční kontejnery seřadí své prvky v přísné lineární sekvenci. Prvky jsou přístupné podle jejich pozice v sekvenci. |
Dvojitě propojený seznam | Každý prvek obsahuje informace o tom, jak najít předchozí a následující prvky. To umožňuje konstantní čas pro operace vkládání a mazání. |
Alokátor s vědomím | Objekt alokátoru se používá pro dynamickou úpravu velikosti úložiště. |
Vložení do seznamu
Existují různé funkce, které můžeme použít k vložení hodnot do seznamu. Pojďme si to ukázat:
Příklad 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'; } }
Výstup:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte soubor záhlaví algoritmu.
- Chcete-li používat jeho funkce, zahrňte soubor záhlaví iostream.
- Chcete-li používat jeho funkce, zahrňte soubor záhlaví seznamu.
- Zavolejte funkci main(). Programová logika by měla být přidána do těla této funkce.
- Vytvořte seznam s názvem můj_seznam se sadou 4 celých čísel.
- Vložte prvek 11 na začátek seznamu s názvem my_list.
- Vložte prvek 18 na konec seznamu s názvem my_list.
- Vytvořte jej iterátor a použijte jej k nalezení prvku 10 ze seznamu my_list.
- Pomocí příkazu if určete, zda byl výše uvedený prvek nalezen nebo ne.
- Vložte prvek 21 před výše uvedený prvek, pokud byl nalezen.
- Konec těla příkazu if.
- Pomocí cyklu for vytvořte proměnnou x cyklu. Tato proměnná bude použita k iteraci prvků seznamu.
- Vytiskněte hodnoty seznamu na konzole.
- Konec těla smyčky for.
- Konec těla funkce main().
Smazání ze seznamu
Je možné odstranit položky ze seznamu. Funkce erase() umožňuje odstranit položku nebo rozsah položek ze seznamu.
- Chcete-li odstranit jednu položku, jednoduše předáte jednu celočíselnou pozici. Položka bude smazána.
- Chcete-li odstranit rozsah, předáte počáteční a koncový iterátor. Pojďme si to ukázat.
Příklad 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; }
Výstup:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte soubor záhlaví algoritmu.
- Chcete-li používat jeho funkce, zahrňte soubor záhlaví iostream.
- Chcete-li používat jeho funkce, zahrňte soubor záhlaví seznamu.
- Zahrňte do našeho programu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
- Zavolejte funkci main(). Programová logika by měla být přidána do těla této funkce.
- Vytvořte seznam s názvem můj_seznam se sadou 4 celých čísel.
- Vytiskněte nějaký text na konzoli.
- Pomocí cyklu for vytvořte proměnnou x cyklu. Tato proměnná bude použita k iteraci prvků seznamu.
- Vytiskněte hodnoty seznamu na konzole.
- Konec těla smyčky for.
- Vytvořte iterátor i, který ukazuje na první prvek seznamu.
- Použijte funkci erase() označenou iterátorem i.
- Vytiskněte nějaký text na konzoli.
- Pomocí cyklu for vytvořte proměnnou x cyklu. Tato proměnná bude použita k iteraci prvků seznamu.
- Vytiskněte hodnoty seznamu na konzole. To přichází po smazání.
- Konec těla smyčky for.
- Program musí po úspěšném dokončení vrátit hodnotu.
- Konec těla funkce main().
Shrnutí
- Std::list je úložný kontejner.
- Umožňuje vkládání a mazání položek odkudkoli v konstantním čase.
- Je implementován jako double-link
- K datům std::list lze přistupovat obousměrně a sekvenčně.
- std::list nepodporuje rychlý náhodný přístup. Podporuje však sekvenční přístup ze všech směrů.
- Prvky seznamu std::list můžete rozptýlit do různých částí paměti.
- Během běhu můžete podle potřeby zmenšit nebo rozšířit std::list z obou konců.
- Pro vložení položek do std::list použijeme funkci insert().
- Pro smazání položek ze std::listu použijeme funkci erase().