Skip to content

Latest commit

 

History

History
120 lines (87 loc) · 3.4 KB

04-list.md

File metadata and controls

120 lines (87 loc) · 3.4 KB

Podstawy C++

std::list<T>

Coders School

Lista

Pytanie: jakie cechy miał std::vector<T>?

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.

Pytanie: skąd elementy listy wiedzą o swoim wzajemnym istnieniu?

Każdy element listy przechowuje wskaźnik na element następny (lista jedno kierunkowa) lub następny i poprzedni (lista dwukierunkowa).


Operacje na std::list

  • 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


Pytanie: jak dostać się do 10 elementu listy?

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.


Zadanie

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;
}

Pytanie: kiedy opłaca się używać std::list, a kiedy std::vector?