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:

std::lista

Oto zrzut ekranu kodu:

std::lista

Wyjaśnienie kodu:

  1. Dołącz plik nagłówkowy algorytmu, aby skorzystać z jego funkcji.
  2. Dołącz plik nagłówkowy iostream, aby móc korzystać z jego funkcji.
  3. Dołącz plik nagłówkowy listy, aby skorzystać z jego funkcji.
  4. Wywołaj funkcję main(). Logikę programu należy dodać w treści tej funkcji.
  5. Utwórz listę o nazwie moja_lista zawierającą zestaw 4 liczb całkowitych.
  6. Użyj pętli for, aby utworzyć zmienną pętli x. Ta zmienna będzie używana do iteracji po elementach listy.
  7. Wydrukuj wartości listy na konsoli.
  8. Koniec korpusu dla pętli.
  9. 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:

lista Konstruktorów

Oto zrzut ekranu kodu:

lista Konstruktorów

Wyjaśnienie kodu:

  1. Dołącz plik nagłówkowy iostream, aby móc korzystać z jego funkcji.
  2. Dołącz plik nagłówkowy listy, aby skorzystać z jego funkcji.
  3. Dołącz przestrzeń nazw std do kodu, aby używać jej klas bez wywoływania jej.
  4. Wywołaj funkcję main(). Logikę programu należy dodać w treści tej funkcji.
  5. Utwórz pustą listę o nazwie l.
  6. Utwórz listę o nazwie l1 zawierającą zestaw 3 liczb całkowitych.
  7. Utwórz listę o nazwie l2 ze wszystkimi elementami listy o nazwie l1, od początku do końca.
  8. Utwórz listę o nazwie l3, używając semantyki przenoszenia. Lista l3 będzie miała taką samą zawartość jak lista l2.
  9. Wydrukuj rozmiar listy o nazwie l na konsoli wraz z innym tekstem.
  10. Wydrukuj tekst na konsoli.
  11. Utwórz iterator o nazwie iterator i użyj go do iteracji po elementach listy o nazwie l2.
  12. Wydrukuj na konsoli elementy listy o nazwie l2.
  13. Wydrukuj tekst na konsoli.
  14. Utwórz iterator o nazwie iterator i użyj go do iteracji po elementach listy o nazwie l3.
  15. Wydrukuj na konsoli elementy listy o nazwie l3.
  16. Program musi zwrócić wartość po pomyślnym zakończeniu.
  17. 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:

Wstawianie do listy

Oto zrzut ekranu kodu:

Wstawianie do listy

Wyjaśnienie kodu:

  1. Dołącz plik nagłówkowy algorytmu, aby skorzystać z jego funkcji.
  2. Dołącz plik nagłówkowy iostream, aby móc korzystać z jego funkcji.
  3. Dołącz plik nagłówkowy listy, aby skorzystać z jego funkcji.
  4. Wywołaj funkcję main(). Logikę programu należy dodać w treści tej funkcji.
  5. Utwórz listę o nazwie moja_lista zawierającą zestaw 4 liczb całkowitych.
  6. Wstaw element 11 na początek listy o nazwie moja_lista.
  7. Wstaw element 18 na koniec listy o nazwie moja_lista.
  8. Utwórz iterator i za jego pomocą znajdź element 10 z listy moja_lista.
  9. Użyj instrukcji if, aby określić, czy powyższy element został znaleziony, czy nie.
  10. Wstaw element 21 przed powyższym elementem, jeśli został znaleziony.
  11. Koniec treści instrukcji if.
  12. Użyj pętli for, aby utworzyć zmienną pętli x. Ta zmienna będzie używana do iteracji po elementach listy.
  13. Wydrukuj wartości listy na konsoli.
  14. Koniec ciała pętli for.
  15. 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:

Usuwanie z listy

Oto zrzut ekranu kodu:

Usuwanie z listy

Wyjaśnienie kodu:

  1. Dołącz plik nagłówkowy algorytmu, aby skorzystać z jego funkcji.
  2. Dołącz plik nagłówkowy iostream, aby móc korzystać z jego funkcji.
  3. Dołącz plik nagłówkowy listy, aby skorzystać z jego funkcji.
  4. Dołącz przestrzeń nazw std do naszego programu, aby móc korzystać z jej klas bez wywoływania jej.
  5. Wywołaj funkcję main(). Logikę programu należy dodać w treści tej funkcji.
  6. Utwórz listę o nazwie moja_lista zawierającą zestaw 4 liczb całkowitych.
  7. Wydrukuj tekst na konsoli.
  8. Użyj pętli for, aby utworzyć zmienną pętli x. Ta zmienna będzie używana do iteracji po elementach listy.
  9. Wydrukuj wartości listy na konsoli.
  10. Koniec treści pętli for.
  11. Utwórz iterator i, który wskazuje pierwszy element listy.
  12. Użyj funkcji erase() wskazanej przez iterator i.
  13. Wydrukuj tekst na konsoli.
  14. Użyj pętli for, aby utworzyć zmienną pętli x. Ta zmienna będzie używana do iteracji po elementach listy.
  15. Wydrukuj wartości listy na konsoli. Dzieje się to po usunięciu.
  16. Koniec treści pętli for.
  17. Program musi zwrócić wartość po pomyślnym zakończeniu.
  18. 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().