algorytmy i struktury danych. - wozna.org · rozszerzaja˛c++ o biblioteke˛ szablonów klas i...
TRANSCRIPT
Algorytmy i Struktury Danych.Standard Template Library. Czesc 1.
Bozena [email protected]
Jan Długosz University, Poland
Wykład 6
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 1 / 30
Standard Template Library - Literatura
Stephen Prata: Jezyk C++, Szkoła Programowania. Robomatic,2003 lub Helion, 2006.
Nicolai M. Josuttis: C++ Biblioteka standardowa. PodrecznikProgramisty. Helion, 2003.
Scott Meyers: STL w praktyce. 50 sposobów efektywnegowykorzystania. Helion, 2004.http://www.sgi.com/tech/stl/
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 2 / 30
Standard Template Library - krótka historia
1990 - Alex Stepanov i Meng Lee z laboratoriów Hewlett Packardrozszerzaja C++ o biblioteke szablonów klas i funkcji, nazywanadzis STL.
1994 - STL zostaje uznany za standard - ANSI/ISO Standard C++.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 3 / 30
Standard Template Library - co to jest ?
Standard Template Library (STL) to biblioteka szablonów, wsródktórych znajduja sie:
KonteneryIteratoryAlgorytmy
Obiekty funkcyjne - funktory
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 4 / 30
Standard Template Library - co to jest ?
Kontener to jednostka, która – podobnie jak tablica – umozliwiaprzechowywanie wielu wartosci. Kontenery udostepniane przezbiblioteke STL sa jednorodne, a zatem moga zawierac wyłaczniewartosci tego samego typu.
Algorytm jest grupa instrukcji opisujacych sposób wykonaniakonkretnego zadania, jak np. sortowanie tablicy, czy wyszukaniena liscie okreslonej wartosci.
Iterator to obiekt pozwalajacy sie przemieszczac po elementachkontenera. Iteratory sa uogólnieniem wskazników.
Obiekt funkcyjny (funktor) to obiekt zachowujacy sie jak funkcja.Funktory moga byc obiektami klas lub wskaznikami do funkcji.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 5 / 30
Kontenery - rodzaje
Sekwencyjne:vector (tablica dynamiczna) i bit_vector == vector < bool >deque (tablica dynamiczna dwukierunkowa; kolejka o dwóchkoncach)list (lista dwukierunkowa) i slist (lista jednokierunkowa)tablica i string nie sa kontenerami STL, ale mozna je przetwarzacza pomoca algorytmów STL
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 6 / 30
Kontenery - rodzaje
Sekwencyjne:vector (tablica dynamiczna) i bit_vector == vector < bool >deque (tablica dynamiczna dwukierunkowa; kolejka o dwóchkoncach)list (lista dwukierunkowa) i slist (lista jednokierunkowa)tablica i string nie sa kontenerami STL, ale mozna je przetwarzacza pomoca algorytmów STL
Asocjacyjne - implementowane za pomaca drzew typu BST:set (zbiór) i multiset (multi-zbiór)map (mapa) i multimap (multimapa)hash, hash_set, hash_multiset,hash_map, hash_multimap
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 6 / 30
Kontenery - rodzaje
Sekwencyjne:vector (tablica dynamiczna) i bit_vector == vector < bool >deque (tablica dynamiczna dwukierunkowa; kolejka o dwóchkoncach)list (lista dwukierunkowa) i slist (lista jednokierunkowa)tablica i string nie sa kontenerami STL, ale mozna je przetwarzacza pomoca algorytmów STL
Asocjacyjne - implementowane za pomaca drzew typu BST:set (zbiór) i multiset (multi-zbiór)map (mapa) i multimap (multimapa)hash, hash_set, hash_multiset,hash_map, hash_multimap
Adaptery - nie wspieraja iteratorów:stackqueuepriority_queue
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 6 / 30
Kontener vector – #include <vector>
Zaimplementowany jako tablica dynamiczna
Dynamicznie rozszerzalny szybki dostep do elementów zapomoca operatora []
Moze zawierac elementy dowolnego typuMetody:
Kontener.push_back(element) - dodaje element do kontenera nakoniec.Kontener.pop_back() - usuwa ostatni element z kontenera.Kontener.size() - zwraca rozmiar kontenera.Kontener.max_size() - zwraca maksymalny rozmiar kontenera.Kontener.capacity() - zwraca maksymalna liczbe elementów, któramoze zostac wstawiona do kontenera Kontener bez realokacji.Kontener.empty() - sprawdza czy kontener nie jest pusty.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 7 / 30
Dostep do elementów kontenera vector
Kontener.at(index) - zwraca element wektora z pozycji index .
Kontener.v(index) - zwraca element wektora z pozycji index .
Kontener.front() - zwraca pierwszy element wektora. Niesprawdza, czy kontener jest pusty.
Kontener.back() - zwraca ostatni element wektora. Nie sprawdza,czy kontener jest pusty.
http://www.sgi.com/tech/stl/Vector.html
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 8 / 30
Kontener vector - przykład 1
#include <iostream>#include <vector>using namespace std;int main() {
vector<int> intvect; // kontener wektorowy dla liczb całko witychcout << "Podaj ile elementów chcesz mie c w wektorze: " << endl;int n; cin >> n;// n - elementowy kontener wektorowy dla liczb całkowitychvector<int> intvect1(n);for (int i=1; i<=n; ++i){
intvect.push_back(i); //dołacz elementy i na koniec kont eneraintvect1[i-1] = i; //dołacz elementy i na i-1 miejsce w kont enerzeintvect1.push_back(2 * i); //dołacz elementy 2i na koniec kontenera
}// wyswietl wszystkie elementy rozdzielone spacjamifor (int i=0; i < intvect.size(); ++i) //1 2 3 4 5
cout << intvect[i] << ’ ’;cout << endl;for (int i=0; i < intvect1.size(); ++i)//1 2 3 4 5 2 4 6 8 10
cout << intvect1[i] << ’ ’;return 0;}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 9 / 30
Kontener vector - przykład 2
#include <iostream>#include <vector>using namespace std;int main() {
int a[5] = {12, 7, 9, 21, 13 };vector<int> v(a,a+5); //utwórz kontener v zainicjalizowa ny tablica afor (int i=0; i < 5; ++i) cout << a[i] << ’ ’;cout << endl; // 12 7 9 21 13for (int i=0; i < v.size(); ++i) cout << v[i] << ’ ’;cout << endl; // 12 7 9 21 13v.pop_back();for (int i=0; i < v.size(); ++i) cout << v[i] << ’ ’;cout << endl; // 12 7 9 21v.push_back(15);for (int i=0; i < v.size(); ++i) cout << v[i] << ’ ’;cout << endl; // 12 7 9 21 15return 0;
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 10 / 30
int array[5] = {12, 7, 9, 21, 13 };vector<int> v(array,array+5);
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 11 / 30
Kontener vector - przykład 3
#include <iostream>#include <string>#include <vector>using namespace std;int main(){
const int NUM = 5;vector<int> ratings(NUM);vector<string> titles(NUM);cout << "Postepuj dokładnie według instrukcji. Wpisz\n"
<< NUM << "tytułów ksi ˛a zek oraz ich oceny na skali 0-10.\n";for (int i = 0; i < NUM; i++) {
cout << "Wpisz tytuł numer " << i + 1 << ": ";getline(cin, titles[i]);cout << "Wpisz ocene na skali 0-10: ";cin >> ratings[i];cin.get();
}cout << "Dziekuje. Twoje dane:\n" << "Ocena\t Ksi ˛a zka\n";for (int i = 0; i < NUM; i++) {
cout << ratings[i] << "\t" << titles[i] << endl;}return 0;
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 12 / 30
Kontener vector - przykład 4
#include <iostream>#include <vector>using namespace std;int main(){
int arr[] = { 12, 3, 17, 8 }; // standardowa tablica Cvector<int> v(arr, arr+4); // inicjalizacja v tablica Cwhile (!v.empty()) // czy wektor jest pusty ?{
cout << v.back() << " "; //zwraca ostatni element wektorav.pop_back(); // usuwa ostatni element wektora
}cout << endl;//8 17 3 12return 0;
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 13 / 30
Kontener vector - Konstruktory
vector<T> v; - Deklaracja wektora danych typu T.
vector<T> v(size_type n); - Deklaracja wektora danych typu T orozmiarze n.
vector<T> v(size_type n,const T& t); - Deklaracja wektoradanych typu T o rozmiarze n zawierajacego wartosc t .
vector<T> v(begin_iterator, end_iterator); - Kopia wektoradanych typu T z zakresu begin_iterator, end_iterator .
vector<T> v(vector<T> v1); - Kopia wektora danych typu T onazwie v1 .
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 14 / 30
Kontener vector - Konstruktory
int arr[] = { 12, 3, 17, 8 };vector<int> v(arr, arr+4); // 12 3 17 8vector<int> v1(v); // 12 3 17 8vector<int> v2(10); // 0 0 0 0 0 0 0 0 0 0vector<int> v3(10,5); // 5 5 5 5 5 5 5 5 5 5
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 15 / 30
Usuwania elementów z kontenera vector
Kontener.erase() - usuwa wszystkie elementy z kontenera.
Kontener.erase(iterator) - usuwa element wskazywany przeziterator z kontenera i zwraca iterator do nastepnego elementu.
Kontener.erase(begin_iterator, end_iterator) - usuwa element zzakresu begin_iterator, end_iterator z kontenera izwraca iterator do nastepnego elementu.
Kontener.clear() - usuwa wszystkie elementy z kontenera.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 16 / 30
Wstawianie elementów do kontenera vector
Kontener.insert(iterator, const T& t) - wstawia element t wmiejsce wskazywane przez iterator .
Kontener.insert(iterator pos, size_type n, const T& x) -wstawia przed pozycje pos n kopii elementu x .
Kontener.insert(iterator pos, begin_iterator, end_iterator) -wstawia przed pozycje pos elementy z zakresu odbegin_iterator do end_iterator
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 17 / 30
Iteratory i ich typy
Iteratory zachowuja sie jak zwyczajne wskazniki ...∗, >, ++, −−, ==, ! =, =
(vector, dequeue: −, <, >, +, (int) )
kontener::iterator nazwa // zapis i odczyt
kontener::const_iterator nazwa // tylko odczyt
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 18 / 30
Iteratory
Iterator pozwala na przemieszczanie sie po elementachkontenera
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 19 / 30
Iteratory
Funkcje składowe begin() i end() zwracaja iterator odpowiedniodo pierwszego elementu kontenera i do pierwszego za ostatnimelementem kontenera.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 20 / 30
Iteratory
Mozna miec wiele iteratorów wskazujacyhc na rózne badzidentyczne elementy kontenera
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 21 / 30
Iteratorty
#include <iostream>#include <vector>using namespace std;int main() {
int arr[] = { 12, 3, 17, 8 };vector<int> v(arr, arr+4);// definicja iteratora dla vector’a//i ustawienie go na jego pierwszy elementvector<int>::iterator iter = v.begin();cout << "Pierwszy element v = " << * iter << endl; // 12iter++;cout << "Drugi element v = " << * iter << endl; // 3iter = v.end()-1;cout << "Ostatni element v = " << * iter << endl; //8
return 0;}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 22 / 30
Iteratorty
#include <iostream>#include <vector>using namespace std;int max(vector<int>::iterator start, vector<int>::iter ator end);int main() {
int arr[] = { 12, 3, 17, 101 , 34, 2, 84};vector<int> v(arr, arr+7);cout << "max of v = " << max(v.begin(),v.end()) << endl; //101return 0;
}int max(vector<int>::iterator start, vector<int>::iter ator end) {
int m = * start;while(start != end){
if ( * start > m) m = * start;++start;
}return m;
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 23 / 30
Iteratorty
#include <iostream>#include <vector>using namespace std;int main() {
int arr[] = { 12, 3, 17, 101 , 34, 2, 84};vector<int> v(arr, arr+7);for (vector<int>::iterator i = v.begin(); i != v.end(); i++ )// initialize i with pointer to first element of v// i++ increment iterator, move iterator to next element{
cout << * i << " ";// de-referencing iterator returns the// value of the element the iterator points at
}cout << endl;return 0;
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 24 / 30
Kategorie iteratorów
Iteratory dziela sie na 5 kategorii, w których kategoria wyzsza(bardziej szczegółowa) zawsze zawiera kategorie nizsza (bardziejogólna).
Na przykład: Algorytm akceptujacy iterator forward bedzie równiezpracował z iteratorem dwukierunkowym i swobodnego dostepu.
Nie kazdy iterator moze byc uzyty z kazdym kontenerem !
Na przykład: klasa list nie ma iteratora swobodnego dostepu.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 25 / 30
Kategorie iteratorów
Kategoria iteratora okresla osiagalne operacjeIterator forward:
iter ++ (inkrementacja)∗iter (dereferencja)== and ! = (porównanie)
Iterator bidirectional dodatkowo posiada:iter −− (dekrementacje)
iterator swobodnego dostepu (random-access) dodatkowoposiada:
iter [n] (operator indeksowania)iter = +n (n-krotna inkrementacje)
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 26 / 30
Algorytm For_Each()
#include <iostream>#include <vector>#include <algorithm>using namespace std;void show(int n) { cout << n << " "; }int main(){
int arr[] = { 12, 3, 17, 101 , 34, 2, 84}; vector<int> v(arr, arr +7);/ * Zastosuj funkcje show do ka zdego elementu wektora v * /for_each (v.begin(), v.end(), show); //12 3 17 101 34 2 84return 0;
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 27 / 30
Algorytm Find()
#include <iostream>#include <vector>#include <algorithm>using namespace std;int main() {
int key;int arr[] = { 12, 3, 17, 8, 34, 56, 9 };vector<int> v(arr, arr+7);vector<int>::iterator iter;cout << "Wpisz warto s c :";cin >> key;iter = find(v.begin(),v.end(),key);if (iter != v.end()) cout << "Element " << key << " Zanleziony" << endl;else cout << "Elementu " << key << " nie ma w wektorze v" << endl;return 0;
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 28 / 30
Algorytm Find_If()
#include <iostream>#include <vector>#include <algorithm>using namespace std;bool mytest(int n) {
if ((n>21) && (n<36)) return true;else return false;
}int main(){
int arr[] = { 12, 3, 22, 23, 34, 56, 9 };vector<int> v(arr, arr+7);vector<int>::iterator iter;
// zwraca pierwszy iterator, który spełnia warunek funkcjiiter = find_if(v.begin(),v.end(), mytest);if (iter != v.end()) cout << "Element " << * iter << endl;else cout << "Elementu nie ma w wektorze v" << endl;return 0;
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 29 / 30
Algorytm count_If()
#include <iostream>#include <vector>#include <algorithm>using namespace std;bool mytest(int n) { return (n>14) && (n <36); };int main(){
int arr[] = { 12, 3, 17, 8, 34, 56, 9 };vector<int> v(arr, arr+7);// znajduje liczbe elementów spelniajacych warunek funkc jiint n=count_if(v.begin(),v.end(),mytest);cout << "Zaleziono " << n << " elementów" << endl;return 0;
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 6 30 / 30