algorytmy i struktury danych. - wozna.org · rozszerzaja˛c++ o biblioteke˛ szablonów klas i...

32
Algorytmy i Struktury Danych. Standard Template Library. Cz˛ c 1. Bo˙ zena Wo´ zna-Szcze´ sniak [email protected] Jan Dlugosz University, Poland Wyklad 6 Bo˙ zena Wo´ zna-Szcze´ sniak (AJD) Algorytmy i Struktury Danych. Wyklad 6 1 / 30

Upload: nguyenhuong

Post on 01-Mar-2019

225 views

Category:

Documents


2 download

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