Lista w przeciwieństwie do wektora jest porozrzucana po pamięci. Co czasami jest wygodne, gdyż możemy wykorzystać fragmenty pamięci, które mogłyby być niedostępne dla wektora.
Każdy element listy przechowuje wskaźnik na element następny (lista jedno kierunkowa) lub następny i poprzedni (lista dwukierunkowa).
-
pobranie pierwszego i ostatniego elementu listy
front()
back()
-
początek i koniec listy
begin()
end()
-
informacja o liczbie elementów w liście
size()
-
informacja czy lista jest pusta
empty()
-
dodanie elementu na koniec listy
push_back()
-
NOWOŚĆ dodanie elementu na początek listy
push_front()
-
NOWOŚĆ sortowanie elementów listy (nie możemy korzystać z
std::sort
dla listy)sort()
Dokumentacja na cppreference.org
Ponieważ każdy element listy wie tylko o poprzednim i następnym elemencie, nie możemy tak łatwo dostać się do 10 elementu listy.
Dostęp do pierwszego elementu możemy otrzymać przez front()
lub *begin()
int main() {
std::list<int> list {1, 2, 3, 4, 5};
std::cout << *list.begin();
std::cout << list.front();
}
Dostęp do 10 elementu możemy uzyskać przechodząc od 1 do 10.
int main() {
std::list<int> list {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto it = list.begin();
for (size_t i = 0 ; i < 10 ; ++i) {
++it; // jump to next element
}
std::cout << *it;
}
Zajmuje to więcej czasu, niż dostanie się do 10 elementu w std::vector
.
Napisz funkcję, która przyjmuje wektor i zwraca listę, która zawiera posortowane wartości z wektora. Pobierz zadanie
#include <iostream>
#include <vector>
// Implement createSortedList
// It should take a vector and return a list of sorted elements
// add proper include :)
int main() {
std::vector<int> vec{2, 3, 4, 1, 6, 5, 8, 7, 9, 0};
auto list = createSortedList(vec);
for (const auto& el : list)
std::cout << el << " ";
return 0;
}