Co to jest std :: list?
W 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 Biblioteka szablonów standardowych nie obsługuje szybkiego dostępu losowego, ale obsługuje dostęp sekwencyjny ze wszystkich kierunków.
Możesz rozrzucać elementy listy w różnych fragmentach pamięci. Informacje potrzebne do sekwencyjnego dostępu do danych są przechowywane w kontenerze. Std :: list może się rozszerzać i zmniejszać z obu końców w razie potrzeby w czasie wykonywania. Wewnętrzny podzielnik automatycznie spełnia wymagania magazynowe.
W tym samouczku C ++ nauczysz się:
- Co to jest std :: list?
- Dlaczego warto używać std :: list?
- Składnia listy
- Funkcje listy C ++
-
Konstruktorzy - Właściwości kontenera
- Wstawianie do listy
- Usuwanie z listy
Dlaczego warto używać std :: list?
Oto powód użycia std :: List:
- Std :: list działa lepiej w porównaniu z innymi kontenerami sekwencji, takimi jak tablica i wektor.
- Mają lepszą wydajność podczas wstawiania, przesuwania i wyciągania elementów z dowolnej pozycji.
- Std :: list radzi sobie również lepiej z algorytmami, które intensywnie wykonują takie operacje.
Składnia listy
Aby zdefiniować std :: list, musimy zaimportować plik nagłówkowy
. Oto składnia definicji std :: list:
template < class Type, class Alloc =allocator> class list;
Oto opis powyższych parametrów:
- T - określa typ zawartego elementu.
Możesz zastąpić T dowolnym typem danych, nawet typami zdefiniowanymi przez użytkownika.
- Przydziel - definiuje typ obiektu alokatora.
Domyślnie używa to szablonu klasy alokatora. Jest zależny od wartości i używa prostego modelu alokacji pamięci.
Przykłady 1:
#include#include #include int main() {std::list
my_list = { 12, 5, 10, 9 };for (int x : my_list) {std::cout << x << '\n';}}
Wynik:
Oto zrzut ekranu kodu:
Objaśnienie kodu:
- Dołącz plik nagłówkowy algorytmu, aby użyć jego funkcji.
- Dołącz plik nagłówkowy iostream, aby korzystać z jego funkcji.
- Dołącz plik nagłówka listy, aby korzystać z jego funkcji.
- Wywołaj funkcję main (). Logikę programu należy dodać w treści tej funkcji.
- Utwórz listę o nazwie my_list z zestawem 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 treści pętli for.
- Koniec treści funkcji main ().
Funkcje listy C ++
Oto typowe funkcje std :: list:
Funkcjonować | Opis |
wstawić() | Ta funkcja wstawia nowy element przed pozycją wskazywaną przez iterator. |
push_back () | Ta funkcja dodaje nową pozycję na końcu listy. |
push_front () | Dodaje nową pozycję na początku listy. |
pop_front () | Usuwa pierwszą pozycję z listy. |
rozmiar() | Ta funkcja określa liczbę elementów listy. |
z przodu() | Aby określić pierwsze pozycje listy. |
z powrotem() | Aby określić ostatnią pozycję listy. |
odwrócić() | Odwraca elementy listy. |
łączyć() | Łączy dwie posortowane listy. |
Konstruktorzy
Oto lista funkcji dostarczonych przez plik nagłówkowy
:
- Domyślny konstruktor std :: list :: list () - Tworzy pustą listę, która ma zero elementów.
- Konstruktor wypełnienia std :: list :: list () - tworzy listę zawierającą n elementów i przypisuje każdemu elementowi wartość zero (0).
- Konstruktor zakresu std :: list :: list () - tworzy listę z wieloma elementami w zakresie od pierwszego do ostatniego.
- Konstruktor kopiujący std :: list :: list () - tworzy listę z kopią każdego elementu zawartego na istniejącej liście.
- Konstruktor ruchu std :: list :: list () - tworzy listę z elementami innej listy przy użyciu semantyki przenoszenia.
- Konstruktor listy inicjalizacyjnej std :: list :: list () - tworzy listę z elementami innej listy przy użyciu semantyki przenoszenia.
Przykład 2:
#include#include using namespace std;int main(void) {list
l;list l1 = { 10, 20, 30 };list l2(l1.begin(), l1.end());list 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;}
Wynik:
Oto zrzut ekranu kodu:
Objaśnienie kodu:
- Dołącz plik nagłówkowy iostream, aby korzystać z jego funkcji.
- Dołącz plik nagłówka listy, aby korzystać z jego funkcji.
- Uwzględnij w kodzie przestrzeń nazw std, 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 z zestawem 3 liczb całkowitych.
- Utwórz listę o nazwie l2 ze wszystkimi elementami na liście o nazwie l1, od początku do końca.
- Utwórz listę o nazwie l3 przy użyciu semantyki przenoszenia. Lista l3 będzie miała taką samą zawartość jak lista l2.
- Wydrukuj rozmiar listy o nazwie l na konsoli obok innego tekstu.
- Wydrukuj tekst na konsoli.
- Utwórz iterator o nazwie go i użyj go do iteracji po elementach listy o nazwie l2.
- Wydrukuj elementy listy o nazwie l2 na konsoli.
- Wydrukuj tekst na konsoli.
- Utwórz iterator o nazwie go i użyj go do iteracji po elementach listy o nazwie l3.
- Wydrukuj elementy listy o nazwie l3 na konsoli.
- 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:
własność | Opis |
Sekwencja | Kontenery sekwencji porządkują swoje elementy w ściśle liniowej kolejności. Dostęp do elementów uzyskuje się na podstawie ich pozycji w sekwencji. |
Lista podwójnie połączona | Każdy element zawiera informacje o tym, jak zlokalizować poprzednie i następne elementy. Pozwala to na stały czas operacji wstawiania i usuwania. |
Uwzględniający alokatora | Obiekt alokatora służy do dynamicznej modyfikacji rozmiaru pamięci. |
Wstawianie do listy
Istnieją różne funkcje, których możemy użyć do wstawienia wartości do listy. Pokażmy to:
Przykład 3:
#include#include #include int main() {std::list
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';}}
Wynik:
Oto zrzut ekranu kodu:
Objaśnienie kodu:
- Dołącz plik nagłówkowy algorytmu, aby użyć jego funkcji.
- Dołącz plik nagłówkowy iostream, aby korzystać z jego funkcji.
- Dołącz plik nagłówka listy, aby korzystać z jego funkcji.
- Wywołaj funkcję main (). Logikę programu należy dodać w treści tej funkcji.
- Utwórz listę o nazwie my_list z zestawem 4 liczb całkowitych.
- Wstaw element 11 na początek listy o nazwie my_list.
- Wstaw element 18 na koniec listy o nazwie my_list.
- Utwórz iterator i użyj go do znalezienia elementu 10 z listy my_list.
- 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 treści pętli for.
- Koniec treści funkcji main ().
Usuwanie z listy
Możliwe jest usuwanie 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ą. Pozycja zostanie usunięta.
- Aby usunąć zakres, należy przekazać początkowe i końcowe iteratory. Pokażmy to.
Przykład 4:
#include#include #include using namespace std;int main() {std::list
my_list = { 12, 5, 10, 9 };cout << "List elements before deletion: ";for (int x : my_list) {std::cout << x << '\n';}list ::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;}
Wynik:
Oto zrzut ekranu kodu:
Objaśnienie kodu:
- Dołącz plik nagłówkowy algorytmu, aby użyć jego funkcji.
- Dołącz plik nagłówkowy iostream, aby korzystać z jego funkcji.
- Dołącz plik nagłówka listy, aby korzystać z jego funkcji.
- Dołącz przestrzeń nazw std do naszego programu, 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 listę o nazwie my_list z zestawem 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 na pierwszy element listy.
- Użyj funkcji erase () wskazywanej 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. To następuje 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 w stałym czasie.
- Jest zaimplementowany jako podwójny link
- Dostęp do danych std :: list można uzyskać dwukierunkowo i sekwencyjnie.
- std :: list nie obsługuje szybkiego dostępu losowego. Jednak obsługuje sekwencyjny dostęp ze wszystkich kierunków.
- Możesz rozrzucić elementy listy std :: list w różnych fragmentach pamięci.
- W razie potrzeby można zmniejszyć lub rozszerzyć std :: list z obu końców w czasie wykonywania.
- Aby wstawić elementy do std :: list, używamy funkcji insert ().
- Aby usunąć elementy ze std :: list, używamy funkcji erase ().