Standardowa biblioteka szablonów –
podstawowe cechy i elementy
2005/2006-2007/2010
Andrzej Walczak
Składniki STL
• Ich podstawowy podział to: kontenery, iteratory,
algorytmy
• Kontenery służą do zarządzania kolekcjami
obiektów takiego samego typu. Realizowane są
jako tablice albo jako listy. Mogą także być
zorganizowane jako drzewa.
• Iteratory obsługują kolekcje kontenerów poprzez
wspólny interfejs. Jest on podobny do interfejsu
wskaźników.
• Algorytmy służą do wykonywania operacji na
elementach kolekcji. Mogą je modyfikować,
sortować, poddawać dowolnym
przekształceniom. Posługują się iteratorami ale
mogą definiować własne funkcje.
Kontenery
• Tworzą dwa podstawowe typy: kontenery
sekwencyjne oraz kontenery asocjacyjne
• Kontenery sekwencyjne to: wektory, kolejki
dwustronne i listy
• Kontenery asocjacyjne to kolekcje sortowane, w
których pozycja elementu zależy wyłącznie od
jego wartości zgodnie z kryterium sortowania.
Wyróżniamy kontenery typu zbiór (set) ,
wielozbiór (multiset), mapa (map) oraz
wielomapa (multimap). Sortowanie w
kontenerze asocjacyjnym jest automatyczne.
Kontener sekwencyjny -
wektor
• PRZYKŁAD
• #include <iostream.h>
• #include <vector>
• #include <conio.h>
• /////////////
• using namespace std;
• int main()
• {
• vector<int> dupa; // otwiera kontener
• //vector na liczby integer
• //wg szblonu klasy vector
• //nazwa kontenera jest dowolna
//doklej elementy od 1 do 10
int i;
//nie musimy wprowadzac rozmiaru kolekcji jak
//przy tablicach
//rozmiar tworzony jest dynamicznie
for (i=1; i<=10; ++i){
dupa.push_back(i);// nazwa okresla obiekt szablonu klasy
}
//wypisz kolekcje
for (i=0;i<dupa.size();++i){
cout<<dupa[i]<<"\n";
} cout<<endl;
getch();
return 0;
}
Przykład 2
#include <iostream.h>
#include <vector>
#include <conio.h>
/////////////
using namespace std;
int main()
{
vector<float> coll; // otwiera kontener
//vector na liczby float
//wg szblonu klasy vector
//nazwa kontenera jest dowolna
int i;
//nie musimy wprowadzac rozmiaru kolekcji
jak
//przy tablicach
//rozmiar tworzony jest dynamicznie
for (i=1; i<=10; ++i){
coll.push_back(i*1.2);
}
//wypisz kolekcje
for (i=0;i<coll.size();++i){
cout<<coll[i]<<"\n";
}
cout<<endl;
getch();
return 0;
}
Kontener sekwencyjny – lista
dwukierunkowa (deque=double
ended queue)
• Jest to dynamiczna tablica zorganizowana tak, aby zapisywanie
mogło się odbywać na każdym jej końcu
• PRZYKŁAD
• #include <iostream.h>
• #include <deque>
• #include <conio.h>
• /////////////
• using namespace std;
• int main()
• {
• deque<float> coll; // otwiera kontener
• //degue na liczby float
• //wg szablonu klasy degue
• //nazwa kontenera jest dowolna
//doklej elementy od 1 do 10
int i;
//nie musimy wprowadzac rozmiaru kolekcji jak
//przy tablicach
//rozmiar tworzony jest dynamicznie
for (i=1; i<=10; ++i){
coll.push_front(i*1.2);/// FUNKCJA DOPISYWANIA NA POCZATEK
KOLEJKI
}
//wypisz kolekcje
for (i=0;i<coll.size();++i){
cout<<coll[i]<<"\n";
}
cout<<endl;
getch();
return 0;
}
Kontener sekwencyjny – LISTA
• Jest to kontener sekwencyjny dwukierunkowy
• #include <iostream.h>
• #include <list>
• #include <conio.h>
• /////////////
• using namespace std;
• void main()
• {
• list<char> coll; // otwiera kontener
• //list na znaki
• //wg szablonu klasy list
• //nazwa kontenera jest dowolna
• //*******************************
//nie musimy wprowadzac rozmiaru kolekcji
//jak przy tablicach
//rozmiar tworzony jest dynamicznie
for (char c='a'; c<='z'; ++c){
coll.push_back(c);}
while(!coll.empty()){
cout<<coll.front()<<' ';//zwraca pierwszy element
dla niepustej listy
coll.pop_front();}// usuwa pierwszy element
cout<<"\n"<<endl;
getch();
}
Kontenery asocjacyjne
• Są nimi:
• Zbiory (set) – kolekcja elementów posortowanych
wg wartości. Każdy element może wystąpić tylko
raz.
• Wielozbiory (multiset)– j.w. Tylko wartości mogą
się powtarzać.
• Mapy(map) – to zbiory par klucz-wartość np..
Nazwa i kolejność jej wystąpienia. Elementy mapy
nie mogą się powtarzać.
• Multimapy (multimap) – j.w. Tylko pary klucz-
wartość mogą się powtarzać.
Iteratory
• Jest to obiekt wyposażony w możliwość nawigowania po
elementach kolekcji kontenera.
• Operacjami iteratorów są:
• * zwraca element z aktualnej pozycji
• ++ przechodzi do nastepnego elementu
• ++ oraz != zwraca wartość logiczną o tym, czy elementy
maja te sama pozycję czy tez nie
• = przypisanie pozycji do której odnosi się iterator
• Funkcje kontenerowe: begin() – zwraca iterator
pokazujący początek elementów w niepustym kontenerze
• Funkcje kontenerowe: end() – zwraca iterator pokazujący
element za końcem elementów w niepustym kontenerze
#include <iostream.h>
#include <list>
#include <conio.h>
using namespace std;
void main(){
list<char> coll; // otwiera kontener
for (char c='a'; c<='z'; ++c){
coll.push_back(c);}
list<char>::const_iterator pos;
for (pos=coll.begin();pos!=coll.end();++pos)
{cout<<*pos<<' ';}
cout<<"\n"<<endl;
getch();
}