std::lista w C++ z Przykładem
Co to jest std::list?
In C++, std::list odnosi się do kontenera magazynu. std:list umożliwia wstawianie i usuwanie elementów z dowolnego miejsca. Lista std::list jest zaimplementowana jako lista podwójnie połączona. Oznacza to, że dostęp do danych listowych można uzyskać dwukierunkowo i sekwencyjnie.
Lista standardowych bibliotek szablonów nie obsługuje szybkiego dostępu losowego, ale obsługuje dostęp sekwencyjny ze wszystkich kierunków.
Elementy listy można rozrzucać w różnych fragmentach pamięci. Informacje potrzebne do sekwencyjnego dostępu do danych przechowywane są w kontenerze. Std::list może się rozszerzać i zmniejszać na obu końcach w miarę potrzeb podczas działania. Wewnętrzny alokator automatycznie spełnia wymagania dotyczące przechowywania.
Po co używać std::list?
Oto powód użycia std::List:
- Std::list radzi sobie lepiej w porównaniu z innymi kontenerami sekwencji, takimi jak tablica i wektor.
- Mają lepszą wydajność podczas wstawiania, przenoszenia i wydobywania elementów z dowolnej pozycji.
- Lista std::list lepiej sprawdza się także w przypadku algorytmów intensywnie wykonujących tego typu operacje.
Składnia listy
Aby zdefiniować std::list, musimy zaimportować plik plik nagłówkowy. Oto składnia definicji std::list:
template < class Type, class Alloc =allocator<T> > class list;
Oto opis powyższych parametrów:
- T – definiuje typ zawartego elementu. T można zastąpić dowolnym typem danych, nawet typem zdefiniowanym przez użytkownika.
- Alloc – definiuje typ obiektu alokatora. Domyślnie używany jest szablon klasy alokatora. Jest zależny od wartości i wykorzystuje prosty model alokacji pamięci.
Przykłady 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'; } }
Wyjście:
Oto zrzut ekranu kodu:
Wyjaśnienie kodu:
- Dołącz plik nagłówkowy algorytmu, aby skorzystać z jego funkcji.
- Dołącz plik nagłówkowy iostream, aby móc korzystać z jego funkcji.
- Dołącz plik nagłówkowy listy, aby skorzystać z jego funkcji.
- Wywołaj funkcję main(). Logikę programu należy dodać w treści tej funkcji.
- Utwórz listę o nazwie moja_lista zawierającą zestaw 4 liczb całkowitych.
- Użyj pętli for, aby utworzyć zmienną pętli x. Ta zmienna będzie używana do iteracji po elementach listy.
- Wydrukuj wartości listy na konsoli.
- Koniec korpusu dla pętli.
- Koniec treści funkcji main().
C++ Lista funkcji
Oto typowe funkcje std::list:
Funkcjonować | OPIS |
---|---|
wstawić() | Ta funkcja wstawia nowy element przed pozycją wskazywaną przez iterator. |
push_back() | Ta funkcja dodaje nowy element na końcu listy. |
push_front() | Dodaje nowy element na początku listy. |
pop_front() | Usuwa pierwszy element listy. |
rozmiar() | Funkcja ta określa liczbę elementów listy. |
przód() | Aby określić pierwsze elementy listy. |
z powrotem() | Aby określić ostatni element listy. |
odwrócić() | Odwraca elementy listy. |
łączyć() | Łączy dwie posortowane listy. |
Konstruktorzy
Oto lista Funkcje dostarczone przez plik nagłówkowy:
- Domyślny konstruktor std::list::list() - Tworzy pustą listę zawierającą zero elementów.
- Konstruktor wypełniający std::list::list() — Tworzy listę składającą się z n elementów i przypisuje każdemu elementowi wartość zero (0).
- Konstruktor zakresu std::list::list() - tworzy listę zawierającą wiele elementów z zakresu od pierwszego do ostatniego.
- Konstruktor kopiujący std::list::list() - Tworzy listę z kopią każdego elementu zawartego na istniejącej liście.
- Konstruktor przenoszenia std::list::list() — tworzy listę zawierającą elementy innej listy przy użyciu semantyki przenoszenia.
- Konstruktor listy inicjującej std::list::list() — tworzy listę z elementami innej listy przy użyciu semantyki przenoszenia.
2 przykład
#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; }
Wyjście:
Oto zrzut ekranu kodu:
Wyjaśnienie kodu:
- Dołącz plik nagłówkowy iostream, aby móc korzystać z jego funkcji.
- Dołącz plik nagłówkowy listy, aby skorzystać z jego funkcji.
- Dołącz przestrzeń nazw std do kodu, aby używać jej klas bez wywoływania jej.
- Wywołaj funkcję main(). Logikę programu należy dodać w treści tej funkcji.
- Utwórz pustą listę o nazwie l.
- Utwórz listę o nazwie l1 zawierającą zestaw 3 liczb całkowitych.
- Utwórz listę o nazwie l2 ze wszystkimi elementami listy o nazwie l1, od początku do końca.
- Utwórz listę o nazwie l3, używając semantyki przenoszenia. Lista l3 będzie miała taką samą zawartość jak lista l2.
- Wydrukuj rozmiar listy o nazwie l na konsoli wraz z innym tekstem.
- Wydrukuj tekst na konsoli.
- Utwórz iterator o nazwie iterator i użyj go do iteracji po elementach listy o nazwie l2.
- Wydrukuj na konsoli elementy listy o nazwie l2.
- Wydrukuj tekst na konsoli.
- Utwórz iterator o nazwie iterator i użyj go do iteracji po elementach listy o nazwie l3.
- Wydrukuj na konsoli elementy listy o nazwie l3.
- Program musi zwrócić wartość po pomyślnym zakończeniu.
- Koniec treści funkcji main().
Właściwości kontenera
Oto lista właściwości kontenera:
Nieruchomość | OPIS |
---|---|
Sekwencja | Kontenery sekwencji porządkują swoje elementy w ścisłej kolejności liniowej. Dostęp do elementów uzyskuje się poprzez ich pozycję w sekwencji. |
Lista podwójnie połączona | Każdy element ma informacje o tym, jak zlokalizować poprzednie i następne elementy. Pozwala to na stały czas operacji wstawiania i usuwania. |
Obsługuje alokatorów | Obiekt alokatora służy do dynamicznego modyfikowania rozmiaru pamięci. |
Wstawianie do listy
Istnieją różne funkcje, których możemy użyć do wstawienia wartości do listy. Zademonstrujmy to:
3 przykład
#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'; } }
Wyjście:
Oto zrzut ekranu kodu:
Wyjaśnienie kodu:
- Dołącz plik nagłówkowy algorytmu, aby skorzystać z jego funkcji.
- Dołącz plik nagłówkowy iostream, aby móc korzystać z jego funkcji.
- Dołącz plik nagłówkowy listy, aby skorzystać z jego funkcji.
- Wywołaj funkcję main(). Logikę programu należy dodać w treści tej funkcji.
- Utwórz listę o nazwie moja_lista zawierającą zestaw 4 liczb całkowitych.
- Wstaw element 11 na początek listy o nazwie moja_lista.
- Wstaw element 18 na koniec listy o nazwie moja_lista.
- Utwórz iterator i za jego pomocą znajdź element 10 z listy moja_lista.
- Użyj instrukcji if, aby określić, czy powyższy element został znaleziony, czy nie.
- Wstaw element 21 przed powyższym elementem, jeśli został znaleziony.
- Koniec treści instrukcji if.
- Użyj pętli for, aby utworzyć zmienną pętli x. Ta zmienna będzie używana do iteracji po elementach listy.
- Wydrukuj wartości listy na konsoli.
- Koniec ciała pętli for.
- Koniec treści funkcji main().
Usuwanie z listy
Istnieje możliwość usunięcia pozycji z listy. Funkcja erase() umożliwia usunięcie elementu lub zakresu elementów z listy.
- Aby usunąć pojedynczy element, wystarczy przekazać jedną pozycję całkowitą. Element zostanie usunięty.
- Aby usunąć zakres, przekazujesz iteratory początkowe i końcowe. Zademonstrujmy to.
4 przykład
#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; }
Wyjście:
Oto zrzut ekranu kodu:
Wyjaśnienie kodu:
- Dołącz plik nagłówkowy algorytmu, aby skorzystać z jego funkcji.
- Dołącz plik nagłówkowy iostream, aby móc korzystać z jego funkcji.
- Dołącz plik nagłówkowy listy, aby skorzystać z jego funkcji.
- Dołącz przestrzeń nazw std do naszego programu, aby móc korzystać z jej klas bez wywoływania jej.
- Wywołaj funkcję main(). Logikę programu należy dodać w treści tej funkcji.
- Utwórz listę o nazwie moja_lista zawierającą zestaw 4 liczb całkowitych.
- Wydrukuj tekst na konsoli.
- Użyj pętli for, aby utworzyć zmienną pętli x. Ta zmienna będzie używana do iteracji po elementach listy.
- Wydrukuj wartości listy na konsoli.
- Koniec treści pętli for.
- Utwórz iterator i, który wskazuje pierwszy element listy.
- Użyj funkcji erase() wskazanej przez iterator i.
- Wydrukuj tekst na konsoli.
- Użyj pętli for, aby utworzyć zmienną pętli x. Ta zmienna będzie używana do iteracji po elementach listy.
- Wydrukuj wartości listy na konsoli. Dzieje się to po usunięciu.
- Koniec treści pętli for.
- Program musi zwrócić wartość po pomyślnym zakończeniu.
- Koniec treści funkcji main().
Podsumowanie
- Std::list to kontener do przechowywania.
- Umożliwia wstawianie i usuwanie elementów z dowolnego miejsca, o stałej porze.
- Jest zaimplementowany jako podwójne łącze
- Dostęp do danych std::list można uzyskać dwukierunkowo i sekwencyjnie.
- std::list nie obsługuje szybkiego dostępu losowego. Obsługuje jednak dostęp sekwencyjny ze wszystkich kierunków.
- Możesz rozrzucić elementy listy std::list w różnych fragmentach pamięci.
- Możesz zmniejszyć lub rozwinąć std::list z obu stron, jeśli zajdzie taka potrzeba w czasie wykonywania.
- Aby wstawić elementy do std::list, używamy funkcji wstaw().
- Aby usunąć elementy z std::list, używamy funkcji erase().