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.

Klasa, której podstawowym zadaniem jest przechowywanie obiektow nazywa się kontenerem.

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.

W przypadku przechowywania typów pochodnych w kontenerze należy stosować wskaźniki - bezpośrednie albo inteligentne, jeśli zależy nam na automatycznym zarządzaniu czasem życia obiektów w kontenerze.

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.