Podręcznik
1. Biblioteka standardowa języka
1.1. Kontenery
W realnym życiu w programowaniu bardzo często naszym zadaniem jest przetworzenie jakichś kolekcji - wartości czy obiektów. Poprzez przetworzenie można zarówno rozumieć ich tworzenie, jak i redukowanie, zmiany, wykonywanie operacji na każdym lub wybranym podzbiorze.
Z drugiej strony - każda kolekcja ma mniej więcej podobny zestaw podstawowych operacji które można na niej wykonać. Można dodać / usunąć elementy, przeszukać ją, czasami zmienić kolejność czy zmienić elementy wchodzące w jej skład.
Skoro funcjonalność kontenera nie zmienia się w zależności od typu przechowywanego elementu, to w języku C++ naturalnym sposobem ich implementacji są szablony. Jednak zastosowanie szablonów wiąże się z określonymi konsekwencjami.
Po pierwsze - kontener jest właścicielem obiektów. W momencie dodawania nowego elementu do kontenera następuje jego kopiowanie, względnie przenoszenie. Zaletą takiego podejścia jest możliwość efektywnego przechowywania każdego typu danych, włączając w to typy proste, oraz brak narzutu pamięciowego.
Natomiast fakt, że kontenery przechowują jednorodne wartości sprawia nam problem gdy w kontenerze chcemy przechowywać obiekty należące do jednej hierarchii klas, ale różnych typów. W tym momencie podanie jako typu konkretyzującego szablon kontenera typu bazowego nie sprawdzi się - w momencie kopiowania zostanie utracona informacja o typie pochodnym.
Ogólnie kontenery w STL są podzielone na dwie główne grupy:
- Kontenery sekwencyjne - w których kolejność elementów jest ustalana przez korzystającego z pojemnika (klienta). Do nich należą m.inn. vector, deque czy list
- Kontenery asocjacyjne - w których klient nie ma kontroli nad kolejnością elementów. Do nich należą set, map, multiset, multimap czy ich wersje nieuporządkonane unordered_...
Zacznijmy od kontenerów sekwencyjnych.