Algorytmy, iteratory, kolekcje niestandardowe



Podobne dokumenty
Programowanie i struktury danych

STL: Lekcja 1&2. Filozofia STL

STL: kontenery. STL: kontenery. STL: kontenery. Typy kontenerów STL. STL: kontenery. STL: kontenery. multimap. Kontener map: przykład zadanie:

Część 4 życie programu

Algorytmy w C++ dla opornych!

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Algorytmy i Struktury Danych. Anna Paszyńska

STL: algorytmy sortujące. STL: algorytmy sortujące. STL: algorytmy sortujące. STL: algorytmy sortujące. STL: algorytmy sortujące

Paradygmaty programowania

STL: algorytmy sortujące. STL: algorytmy sortujące. STL: algorytmy sortujące. STL: algorytmy sortujące. STL: algorytmy sortujące

Wstęp do programowania obiektowego. STL - Standard Template Library

STL: kontenery. Typy kontenerów STL. STL: kontenery. STL: kontenery. STL: kontenery. Typy kontenerów STL. deque (double-ended queue) list

STL Standardt Template Library (wprowadzenie)

obiekty funkcyjne - funktory

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Programowanie komputerowe. Zajęcia 5

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

I - Microsoft Visual Studio C++

Programowanie Obiektowo Zorientowane w języku C++ Biblioteka STL

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Kontenery, algorytmy

Język C++ wykład VIII

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

STL: implementowanie algorytmów C++: STL. STL: implementowanie algorytmów. STL: implementowanie algorytmów. STL: implementowanie algorytmów

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Kurs programowania. Wykład 9. Wojciech Macyna

C++ wprowadzanie zmiennych

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Pliki wykład 2. Dorota Pylak

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Podstawy programowania skrót z wykładów:

STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery

Programowanie obiektowe i C++ dla matematyków

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Programowanie Komponentowe Zarządzanie obiektami: kontenery

Biblioteka STL - wstęp. Biblioteka STL - literatura. Biblioteka STL - przegląd. Biblioteka STL - kwestie techniczne

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Rekurencja. Przygotowała: Agnieszka Reiter

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

BIBLIOTEKA STANDARDOWA C++

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Algorytmy i Struktury Danych.

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Paradygmaty programowania

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Lab 9 Podstawy Programowania

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Jak Windows zarządza pamięcią?

Zaawansowane programowanie w C++ (PCP)

Operatory na rzecz typu TString

Paradygmaty programowania. Paradygmaty programowania

PARADYGMATY PROGRAMOWANIA Wykład 3

W przypadku STL w specyfikacji nazwy pliku nagłówkowego brak rozszerzenia tj. <string> <string.h> zamiast

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Lista, Stos, Kolejka, Tablica Asocjacyjna

Pojemniki Pojemnik to obiekt, którego zadaniem jest przechowywanie innych obiektów.

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Języki i techniki programowania Ćwiczenia 2

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Programowanie w języku C++

Język ludzki kod maszynowy

Aby uzyskać zaliczenie w pierwszym terminie (do 30 stycznia 2018) rozliczyć trzeba co najmniej 8 projektów, po 4 z każdej z części: C++ oraz Python.

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Szablony funkcji i szablony klas

Pliki wykład 2. Dorota Pylak

Wydajność użycia funktorów z biblioteką STL języka C++

Szablony klas, zastosowanie szablonów w programach

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Podstawy Programowania

STL: kontenery C++: STL: kontenery. STL: kontenery. STL: kontenery. STL: kontenery. Fabryka obiektów. Fabryka obiektów

Zaawansowane programowanie w C++ (PCP)

Szablon klasy std::vector

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Zadania z podstaw programowania obiektowego

dr inż. Jarosław Forenc

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

jest mocny, skoro da się w nim wyrazić nowe pojęcia; łatwiej przenieść go na nową platformę jest mniejszy.

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Wstęp do programowania

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz.

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

STL Standard Template Library

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

do instrukcja while (wyrażenie);

Transkrypt:

Algorytmy, iteratory, kolekcje niestandardowe Biblioteka STL Sebastian Deorowicz Politechnika Śląska 2006 11 06 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 1 / 83

Plan wykładu 1 Iteratory Funkcje pomocnicze iteratorów Iteratory odwrotne Iteratory wstawiające Iteratory strumieniowe 2 Algorytmy Algorytmy modyfikujące Algorytmy sortowania i pochodne Algorytmy zbiorowe Algorytmy kopcowe Algorytmy inne Algorytmy matematyczne 3 Kolekcje niestandardowe SGI STL, STLPort, Borland C++ Builder 6+ MS Visual C++ C++ TR1 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 2 / 83

Plan wykładu 1 Iteratory Funkcje pomocnicze iteratorów Iteratory odwrotne Iteratory wstawiające Iteratory strumieniowe 2 Algorytmy Algorytmy modyfikujące Algorytmy sortowania i pochodne Algorytmy zbiorowe Algorytmy kopcowe Algorytmy inne Algorytmy matematyczne 3 Kolekcje niestandardowe SGI STL, STLPort, Borland C++ Builder 6+ MS Visual C++ C++ TR1 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 3 / 83

Funkcje pomocnicze iteratorów template <class InputIterator, class Distance> void advance(inputiterator& i, Distance n) Działanie: Przesuwa iterator o n pozycji w przód Parametry: i iterator wejściowy, postępujący, dwukierunkowy, bądź dostępu swobodnego n liczba elementów Distance w zasadzie typ całkowity, ponieważ muszą być dla niego dostępne operacje <, ++, --, porównania z 0 Zwracana wartość: brak Złożoność: O(1) dla iteratorów dostępu swobodnego O(n) dla pozostałych iteratorów Uwaga: Funkcja nie sprawdza czy nastąpiło przekroczenie zakresu Dla iteratorów dwukierunkowych lub dostępu swobodnego n może być mniejsze od 0 Funkcja w zależności od typu iteratora sama wybiera sposób inkrementacji (opierając się na cechach iteratorów [ang. iterator traits]) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 4 / 83

Funkcje pomocnicze iteratorów template <class InputIterator> typename iterator_traits<inputiterator>::difference_type distance(inputiterator first, InputIterator last) Działanie: Zwraca odległość między iteratorami Parametry: first, last iteratory Zwracana wartość: Odległość między iteratorami, zwykle typu int Złożoność: O(1) dla iteratorów dostępu swobodnego O(last first) dla iteratorów wejściowych, postępujących i dwukierunkowych Uwagi: Funkcja automatycznie wykorzystuje najlepszą implementację do wyznaczenia odległości last powinien być osiągalny z first, bo jeśli nie to zachowanie niezdefiniowane Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 5 / 83

Funkcje pomocnicze iteratorów template <class InputIterator> void iter_swap(forwarditerator iter1, ForwardIterator iter2) Działanie: Zamienia wartości elementów, które wskazują iteratory iter1, iter2 Parametry: iter1, iter2 iteratory Zwracana wartość: Brak Złożoność: O(1) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 6 / 83

Iteratory odwrotne Opis Są adaptatorami iteratorów, w których przedefiniowano operacje inkrementacji i dekrementacji Przydają się czasami np. jeśli wyszukujemy jakiegoś elementu, a następnie chcemy, aby algorytm przetworzył elementy wcześniejsze w odwrotnym porządku Możliwa jest konwersja iteratorów zwykłych na odwrotne (a także w drugą stronę) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 7 / 83

Iteratory odwrotne przykład Przykład #include <iostream> #include <vector> #include <algorithm> const int MAX = 10; using namespace std; int main(int argc, char* argv[]) { int tab[max] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; vector<int> vi(tab, tab+max); ShowCollection(vi); vector<int>::iterator p = find(vi.begin(), vi.end(), 6); cout << *p << endl; // 6 vector<int>::reverse_iterator q(p); cout << *q << endl; // 5 } vector<int>::iterator r(q.base()); cout << *r << endl; // 6 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 8 / 83

Iteratory odwrotne konwersja O co chodzi? Podczas konwersji iteratora na odwrotny zmienia się pozycja wskazywana! Dlaczego?! No cóż, to cecha iteratorów Z iteratorami zwykłymi jest tak, że wskazują one na obszar pamięci; iterator na pozycję za ostatnią też wskazuje na pewien obszar pamięci (zaraz za ostatnim elementem) Problem z iteratorami odwrotnymi bierze się z tego, że też powinno być możliwe wskazywanie na element bezpośrednio przed pierwszym elementem kolekcji taki obszar pamięci może jednak w ogóle nie istnieć! W praktyce iterator zwracany przez rbegin() wskazuje to samo(!) co iterator zwracany przez end() Dla iteratorów odwrotnych inaczej jest zdefiniowana operacja dereferencji odnosi się ona do elementu o jedną pozycję wcześniejszego niż przechowywana przez iterator! Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 9 / 83

Iteratory odwrotne konwersja O co chodzi? Podczas konwersji iteratora na odwrotny zmienia się pozycja wskazywana! Dlaczego?! No cóż, to cecha iteratorów Z iteratorami zwykłymi jest tak, że wskazują one na obszar pamięci; iterator na pozycję za ostatnią też wskazuje na pewien obszar pamięci (zaraz za ostatnim elementem) Problem z iteratorami odwrotnymi bierze się z tego, że też powinno być możliwe wskazywanie na element bezpośrednio przed pierwszym elementem kolekcji taki obszar pamięci może jednak w ogóle nie istnieć! W praktyce iterator zwracany przez rbegin() wskazuje to samo(!) co iterator zwracany przez end() Dla iteratorów odwrotnych inaczej jest zdefiniowana operacja dereferencji odnosi się ona do elementu o jedną pozycję wcześniejszego niż przechowywana przez iterator! Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 9 / 83

Iteratory odwrotne konwersja Konwersja w drugą stronę Do konwersji iteratora odwrotnego na iterator zwykły służy metoda base() udostępniana przez iteratory odwrotne Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 10 / 83

Iteratory wstawiające Problem Podczas wykonywania wielu algorytmów wymagane jest, aby obszar docelowy był dostatecznie duży, bo nie jest wykonywana żadna kontrola zakresu W niektórych przypadkach to nie jest duży problem, bo z góry wiadomo jak duży powinien być obszar docelowy Istnieją jednak sytuacje, w których nie wiadomo tego z góry (np. przy wywołaniu algorytmu replace_copy_if) i najpierw trzeba by było obliczyć jego rozmiar Rozwiązanie Istnieją iteratory wstawiające, które są adaptatorami iteratorów, w których operacja przypisania nowej wartości jest implementowana jak operacja wstawienia tej wartości Iteratory wstawiające nie nadpisują elementów, a wstawiają je Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 11 / 83

Iteratory wstawiające Problem Podczas wykonywania wielu algorytmów wymagane jest, aby obszar docelowy był dostatecznie duży, bo nie jest wykonywana żadna kontrola zakresu W niektórych przypadkach to nie jest duży problem, bo z góry wiadomo jak duży powinien być obszar docelowy Istnieją jednak sytuacje, w których nie wiadomo tego z góry (np. przy wywołaniu algorytmu replace_copy_if) i najpierw trzeba by było obliczyć jego rozmiar Rozwiązanie Istnieją iteratory wstawiające, które są adaptatorami iteratorów, w których operacja przypisania nowej wartości jest implementowana jak operacja wstawienia tej wartości Iteratory wstawiające nie nadpisują elementów, a wstawiają je Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 11 / 83

Iteratory wstawiające Rodzaje iteratorów wstawiających Iterator wstawiający na koniec Iterator wstawiający na początek Ogólny iterator wstawiający Czym się różnią od zwykłych iteratorów? Zwykły iterator nie wie na elementy jakiej kolekcji wskazuje Iterator wskazujący musi wiedzieć jakiego typu jest kolekcja, której dotyczy, żeby wiedzieć jaką metodę kolekcji wywołać Iterator wskazujący jest inicjalizowany obiektem kolekcji, której dotyczy! Iterator ogólny musi być dodatkowo inicjalizowany pozycją, na której będzie wstawiał elementy Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 12 / 83

Iteratory wstawiające Rodzaje iteratorów wstawiających Iterator wstawiający na koniec Iterator wstawiający na początek Ogólny iterator wstawiający Czym się różnią od zwykłych iteratorów? Zwykły iterator nie wie na elementy jakiej kolekcji wskazuje Iterator wskazujący musi wiedzieć jakiego typu jest kolekcja, której dotyczy, żeby wiedzieć jaką metodę kolekcji wywołać Iterator wskazujący jest inicjalizowany obiektem kolekcji, której dotyczy! Iterator ogólny musi być dodatkowo inicjalizowany pozycją, na której będzie wstawiał elementy Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 12 / 83

Algorytmy przykład Przykład #include <algorithm> #include <deque> #include <iterator> using namespace std; int main(int argc, char* argv[]) { deque<int> di; front_insert_iterator<deque<int> > di_f_iter(di); back_insert_iterator<deque<int> > di_b_iter(di); *di_f_iter = 5; *di_f_iter = 10; ShowCollection(di); // 10 5 *di_b_iter = 11; *di_b_iter = 6; ShowCollection(di); // 10 5 11 6 insert_iterator<deque<int> > di_i_iter(di, di.begin()+1); *di_i_iter = 13; ShowCollection(di); // 10 13 5 11 6 back_inserter(di) = 16; ShowCollection(di); // 10 13 5 11 6 16 } copy(di.begin(), di.end(), front_inserter(di)); ShowCollection(di); // 10 13 5 11 6 16 10 13 5 11 6 16 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 13 / 83

Iteratory wstawiające Iterator wstawiający z przodu Wywołuje metodę: push_front(val) Wzorzec klasy: front_insert_iterator Funkcja tworząca: front_inserter(coll) Iterator wstawiający na koniec Wywołuje metodę: push_back(val) Wzorzec klasy: back_insert_iterator Funkcja tworząca: back_inserter(coll) Iterator wstawiający ogólny Wywołuje metodę: insert(pos, val) Wzorzec klasy: insert_iterator Funkcja tworząca: inserter(coll, pos) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 14 / 83

Iteratory strumieniowe Opis Do tej pory jeśli chcieliśmy coś wypisać do strumienia (np. na standardowe wyjście), to dla każdego elementu wykonywaliśmy operację wypisywania do strumienia (operator <<) Iteratory strumieniowe pozwalają na iterowanie bezpośrednio po strumieniu Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 15 / 83

Iteratory strumieniowe wyjściowe konstruktory ostream_iterator(ostream_type& s) Opis: Tworzy iterator strumieniowy operujący na strumieniu s ostream_iterator(ostream_type& s, const chart* delimiter) Opis: Tworzy iterator strumieniowy operujący na strumieniu s, przy czym separatorem będzie delimiter ostream_iterator(const ostream_iterator<t, chart, traits>& x) Opis: Konstruktor kopiujący Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 16 / 83

Iteratory strumieniowe wyjściowe inne operacje ostream_iterator<t, chart, traits>& operator=(const T& value) Opis: Wypisuje wartość value do strumienia ostream_iterator<t, chart, traits>& operator*() Opis: Zwraca *this ostream_iterator<t, chart, traits>& operator++() ostream_iterator<t, chart, traits>& operator++(int) Opis: Inkrementacja pozycji Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 17 / 83

Iteratory strumieniowe wejściowe Opis Podobnie jak istnieją iteratory strumieniowe wyjściowe tak też istnieją iteratory strumieniowe wejściowe Służą one do wczytywania danych ze strumienia Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 18 / 83

Iteratory strumieniowe wejściowe konstruktory istream_iterator(istream_type& s) Opis: Tworzy iterator strumieniowy wejściowy dla strumienia s istream_iterator(const istream_iterator<t, chart, traits, Distance>& x) Opis: Konstruktor kopiujący Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 19 / 83

Iteratory strumieniowe wejściowe inne operacje const T& operator*() const Opis: Odczytuje wartość ze strumienia const T* operator->() const Opis: Zwraca składową aktualnej wartości (wcześniej odczytanej) istream_iterator<t, chart, traits, Distance>& operator++() istream_iterator<t, chart, traits, Distance> operator++(int) Opis: Inkrementuje pozycję iteratora Inne Zdefiniowane operatory == i!= porównywania iteratorów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 20 / 83

Iteratory strumieniowe przykład #include <algorithm> #include <fstream> #include <iostream> #include <iterator> #include <list> #include <map> #include <string> #include <vector> using namespace std; typedef map<string, list<string> > t_dict; t_dict dict; struct sort_letters { inline void operator()(string& s) { string t(s); sort(t.begin(), t.end()); dict[t].push_back(s); }; }; struct longest_list { inline bool operator()(pair<string, list<string> > &x, pair<string, list<string> > &y) { return x.second.size() < y.second.size(); } }; int main(int argc, char* argv[]) { ifstream inf("slownik"); istream_iterator<string> inf_iter(inf); vector<string> vs(inf_iter, istream_iterator<string>()); for_each(vs.begin(), vs.end(), sort_letters()); t_dict::iterator m = max_element(dict.begin(), dict.end(), longest_list()); ostream_iterator<string> ouf_iter(cout, " "); copy(m->second.begin(), m->second.end(), ouf_iter); } Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 21 / 83

Iteratory strumieniowe przykład Jakie będą wyniki dla słownika j. polskiego? akrom arkom karmo karom komar makro marko mokra morka rakom ramko Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 22 / 83

Plan wykładu 1 Iteratory Funkcje pomocnicze iteratorów Iteratory odwrotne Iteratory wstawiające Iteratory strumieniowe 2 Algorytmy Algorytmy modyfikujące Algorytmy sortowania i pochodne Algorytmy zbiorowe Algorytmy kopcowe Algorytmy inne Algorytmy matematyczne 3 Kolekcje niestandardowe SGI STL, STLPort, Borland C++ Builder 6+ MS Visual C++ C++ TR1 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 23 / 83

Algorytmy replace if void replace_if(forwarditerator first, ForwardIterator last, Predicate pred, const T& new_value) Działanie: Zamienia wartość elementów z zakresu [first, last), dla których predykat pred zwrócił wartość true na new_value Parametry: first, last iteratory specyfikujące zakres pred predykat (obiekt funkcyjny bądź wskaźnik na funkcję) wykorzystywany do sprawdzenia czy element należy nadpisać new_value nowa wartość elementów Zwracana wartość: brak Złożoność: O(last first) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 24 / 83

Algorytm replace copy OutputIterator replace_copy(inputiterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value) Działanie: Złożenie algorytmów replace i copy. Wykonuje kopiowanie elementów z zakresu [first, last) do zakresu rozpoczynającego się od result zamieniając jednocześnie wszystkie wystąpienia elementów old_value na new_value Parametry: first, last iteratory specyfikujące źródłowy zakres result iterator specyfikujący początek zakresu docelowego old_value wartość zamieniania new_value nowa wartość Zwracana wartość: Iterator do elementu bezpośrednio za ostatnim skopiowanym z zakresu docelowego Złożoność: O(last first) Uwaga: Zakresy źródłowy i docelowy nie powinny na siebie nachodzić Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 25 / 83

Algorytm replace copy if OutputIterator replace_copy_if(inputiterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value) Działanie: Złożenie algorytmów replace if i copy Parametry: first, last iteratory specyfikujące źródłowy zakres result iterator specyfikujący początek zakresu docelowego pred predykat (obiekt funkcyjny bądź wskaźnik na funkcję) wykorzystywany do sprawdzenia czy element należy nadpisać new_value nowa wartość Zwracana wartość: Iterator do elementu bezpośrednio za ostatnim skopiowanym z zakresu docelowego Złożoność: O(last first) Uwaga: Zakresy źródłowy i docelowy nie powinny na siebie nachodzić Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 26 / 83

Algorytmy fill void fill(forwarditerator first, ForwardIterator last, const T& value) Działanie: Nadpisuje elementy z zakresu [first, last) wartością value Parametry: first, last iteratory specyfikujące źródłowy zakres value nowa wartość Zwracana wartość: brak Złożoność: O(last first) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 27 / 83

Algorytmy fill n void fill_n(outputiterator first, Size n, const T& value) Działanie: Wypełnia n elementów począwszy od pozycji first wartością value Parametry: first iterator specyfikujący początek zakresu n liczba elementów value nowa wartość Zwracana wartość: brak Złożoność: O(n) Uwaga: Brak kontroli zakresu Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 28 / 83

Algorytmy generate void generate(forwarditerator first, ForwardIterator last, Generator gen) Działanie: Wypełnia elementy z zakresu [first, last) wartością zwracaną przez generator gen Parametry: first, last iteratory specyfikujące źródłowy zakres gen obiekt funkcyjny (bądź wskaźnik na funkcję) posiadający bezparametrową metodę operator() zwracającą wartość wstawianą do elementu; metoda jest wywoływana jednorazowo dla każdego elementu Zwracana wartość: brak Złożoność: O(last first) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 29 / 83

Algorytm generate n void generate_n(outputiterator first, Size n, Generator gen) Działanie: Wypełnia n elementów począwszy od pozycji first wartością zwracaną przez generator gen Parametry: first iterator specyfikujący początek zakresu n liczba elementów gen obiekt funkcyjny (bądź wskaźnik na funkcję) posiadający bezparametrową metodę operator() zwracającą wartość wstawianą do elementu; metoda jest wywoływana jednorazowo dla każdego elementu Zwracana wartość: brak Złożoność: O(n) Uwaga: Brak kontroli zakresu Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 30 / 83

Algorytmy przykład Przykład #include <iostream> #include <vector> #include <algorithm> const int MAX = 10; using namespace std; template<class T> struct reader { inline T operator()() { T x; cin >> x; return x; } }; int main(int argc, char* argv[]) { int tab[max] = {1, 4, 3, 6, 7, 4, 7, 8, 9, 0}; vector<int> vi(tab, tab+max); ShowCollection(vi); // 5 5 5 6 7 4 7 8 9 0 fill_n(vi.begin()+1, 3, 6); ShowCollection(vi); // 5 6 6 6 7 4 7 8 9 0 } generate_n(vi.begin(), 2, reader<int>()); // 8 9 ShowCollection(vi); // 8 9 6 6 7 4 7 8 9 0 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 31 / 83

Algorytm unique ForwardIterator unique(forwarditerator first, ForwardIterator last) Działanie: Usuwa powtarzające się elementy na kolejnych pozycjach pozostawiając tylko po jednej kopii Parametry: first, last iteratory specyfikujące źródłowy zakres Zwracana wartość: Iterator do pozycji bezpośrednio za ostatnią Złożoność: O(last first) Uwaga: Podobnie jak algorytm remove nie usuwa fizycznie tych elementów a jedynie nadpisuje je zwracając nowy logiczny koniec; elementy należy później usunąć za pomocą metody erase z kolekcji Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 32 / 83

Algorytm unique ForwardIterator unique(forwarditerator first, ForwardIterator last, BinaryPredicate pred) Działanie: Usuwa powtarzające się elementy na kolejnych pozycjach pozostawiając tylko po jednej kopii Parametry: first, last iteratory specyfikujące źródłowy zakres pred predykat binarny wykorzystywany do porównywania element zamiast operatora == Zwracana wartość: Iterator do pozycji bezpośrednio za ostatnią Złożoność: O(last first) Uwaga: Podobnie jak algorytm remove nie usuwa fizycznie tych elementów a jedynie nadpisuje je zwracając nowy logiczny koniec; elementy należy później usunąć za pomocą metody erase z kolekcji Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 33 / 83

Algorytm unique copy OutputIterator unique_copy(inputiterator first, InputIterator last, OutputIterator result) Działanie: Kopiuje elementy z zakresu źródłowego do docelowego pomijając wielokrotne powtórzenia tych samych elementów na kolejnych pozycjach Parametry: first, last iteratory specyfikujące źródłowy zakres źródłowy result iterator specyfikujący początek zakresu docelowego Zwracana wartość: Iterator do pozycji bezpośrednio za ostatnią z zakresu docelowego Złożoność: O(last first) Uwaga: Brak kontroli zakresu Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 34 / 83

Algorytm unique copy OutputIterator unique_copy(inputiterator first, InputIterator last, OutputIterator result, BinaryPredicate pred) Działanie: Kopiuje elementy z zakresu źródłowego do docelowego pomijając wielokrotne powtórzenia tych samych elementów na kolejnych pozycjach Parametry: first, last iteratory specyfikujące źródłowy zakres źródłowy result iterator specyfikujący początek zakresu docelowego pred predykat używany do porównywania elementów zamiast operatora == Zwracana wartość: Iterator do pozycji bezpośrednio za ostatnią z zakresu docelowego Złożoność: O(last first) Uwaga: Brak kontroli zakresu Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 35 / 83

Algorytmy partial sort copy RandomAccessIterator partial_sort_copy(inputiterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last) Działanie: Umieszcza najmniejsze min(last first, result_last result_first) posortowanych elementów z zakresu źródłowego w zakresie docelowym Parametry: first, last iteratory specyfikujące zakres źródłowy result_first, result_last iteratory specyfikujące zakres docelowy Zwracana wartość: Iterator do elementu bezpośrednio za ostatnim wpisanym do zakresu docelowego Złożoność: O(n log k), gdzie n jest liczbą elementów w zakresie źródłowym, a k jest liczbą posortowanych elementów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 36 / 83

Algorytmy partial sort copy RandomAccessIterator partial_sort_copy(inputiterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp) Działanie: Umieszcza najmniejsze min(last first, result_last result_first) posortowanych elementów z zakresu źródłowego w zakresie docelowym Parametry: first, last iteratory specyfikujące zakres źródłowy result_first, result_last iteratory specyfikujące zakres docelowy comp predykat używany do porównywania elementów zamiast operatora < Zwracana wartość: Iterator do elementu bezpośrednio za ostatnim wpisanym do zakresu docelowego Złożoność: O(n log k), gdzie n jest liczbą elementów w zakresie źródłowym, a k jest liczbą posortowanych elementów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 37 / 83

Algorytmy nth element void nth_element(randomaccessiterator first, RandomAccessIterator nth, RandomAccessIterator last) void nth_element(randomaccessiterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp) Działanie: Częściowo sortuje elementy, aby na pozycji n znalazł się element n-ty co do wielkości, wszystkie elementy niewiększe od niego były na wcześniejszych pozycjach, a wszystkie niemniejsze na późniejszych Parametry: first, last iteratory specyfikujące zakres nth iterator specyfikujący n-ty element comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany do porównywania elementów zamiast operatora < Zwracana wartość: brak Złożoność: O(last first) w przypadku średnim Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 38 / 83

Algorytmy lower bound ForwardIterator lower_bound(forwarditerator first, ForwardIterator last, const T& value) ForwardIterator lower_bound(forwarditerator first, ForwardIterator last, const T& value, Compare comp) Działanie: Wyszukuje pierwszą pozycję o wartości elementu niemniejszej niż value w zakresie [first, last) Parametry: first, last iteratory specyfikujące zakres value wyszukiwana wartość comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy wyszukiwaniu zamiast operatora < Zwracana wartość: Iterator do znalezionej pozycji Złożoność: O(log(last first)) Uwaga: działa tylko dla posortowanych zakresów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 39 / 83

Algorytmy upper bound ForwardIterator upper_bound(forwarditerator first, ForwardIterator last, const T& value) ForwardIterator upper_bound(forwarditerator first, ForwardIterator last, const T& value, Compare comp) Działanie: Wyszukuje pierwszą pozycję o wartości elementu większej niż value w zakresie [first, last) Parametry: first, last iteratory specyfikujące zakres value wyszukiwana wartość comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy wyszukiwaniu zamiast operatora < Zwracana wartość: Iterator do znalezionej pozycji Złożoność: O(log(last first)) Uwaga: działa tylko dla posortowanych zakresów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 40 / 83

Algorytmy equal range pair<forwarditerator, ForwardIterator> equal_range(forwarditerator first, ForwardIterator last, const T& value) pair<forwarditerator, ForwardIterator> equal_range(forwarditerator first, ForwardIterator last,const T& value, Compare comp) Działanie: Wyszukuje zakres elementów o wartościach równych value w zakresie [first, last) Parametry: first, last iteratory specyfikujące zakres value wyszukiwana wartość comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy wyszukiwaniu zamiast operatora < Zwracana wartość: Para iteratorów, z których pierwszy wskazuje na pierwszy element sekwencji równy value, a drugi na pierwszy element za ostatnim elementem sekwencji równym value Złożoność: O(log(last first)) Uwaga: działa tylko dla posortowanych zakresów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 41 / 83

Algorytmy binary search bool binary_search(forwarditerator first, ForwardIterator last, const T& value) bool binary_search(forwarditerator first, ForwardIterator last, const T& value, Compare comp) Działanie: Sprawdza czy element o wartości value występuje w zakresie [first, last) Parametry: first, last iteratory specyfikujące zakres value wyszukiwana wartość comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy wyszukiwaniu zamiast operatora < Zwracana wartość: true jeśli element został znaleziony, false w przeciwnym przypadku Złożoność: O(log(last first)) Uwaga: działa tylko dla posortowanych zakresów Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 42 / 83

Algorytmy merge OutputIterator merge(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) Działanie: Łączy dwa posortowane zakresy, [first1, last1) oraz [first2, last2), w jeden posortowany zakres zaczynający się od pozycji result Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result iterator specyfikujący początek zakresu docelowego Zwracana wartość: Iterator do pierwszego elementu za ostatnim w docelowym zakresie Złożoność: O((last1 first1) + (last2 first2)) Uwaga: Zakres docelowy nie powinien się nakładać z żadnym z zakresów źródłowych Zakres docelowy musi być dostatecznie duży (brak kontroli zakresów) Zakresy źródłowe nie są modyfikowane Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 43 / 83

Algorytmy merge OutputIterator merge(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) Działanie: Łączy dwa posortowane zakresy, [first1, last1) oraz [first2, last2), w jeden posortowany zakres zaczynający się od pozycji result Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result iterator specyfikujący początek zakresu docelowego comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: Iterator do pierwszego elementu za ostatnim w docelowym zakresie Złożoność: O((last1 first1) + (last2 first2)) Uwaga: Zakres docelowy nie powinien się nakładać z żadnym z zakresów źródłowych Zakres docelowy musi być dostatecznie duży (brak kontroli zakresów) Zakresy źródłowe nie są modyfikowane Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 44 / 83

Algorytmy przykład Przykład #include <algorithm> #include <list> #include <vector> const int MAX = 10; using namespace std; int main(int argc, char* argv[]) { int tab[10] = {1, 4, 3, 6, 7, 4, 7, 4, 9, 0}; vector<int> vi1(tab, tab+5); list<int> li2(tab+5, tab+max); vector<int> vi3(10, 0); } ShowCollection(vi1); // 1 4 3 6 7 ShowCollection(li2); // 4 7 4 9 0 merge(vi1.begin(), vi1.end(), li2.begin(), li2.end(), vi3.begin()); ShowCollection(vi3); // 1 4 3 4 6 7 7 4 9 0 sort(vi1.begin(), vi1.end()); li2.sort(); merge(vi1.begin(), vi1.end(), li2.begin(), li2.end(), vi3.begin()); ShowCollection(vi3); // 0 1 3 4 4 4 6 7 7 9 vector<int>::iterator new_end = unique(vi3.begin(), vi3.end()); ShowCollection(vi3); // 0 1 3 4 6 7 9 7 7 9 vi3.erase(new_end, vi3.end()); ShowCollection(vi3); // 0 1 3 4 6 7 9 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 45 / 83

Algorytmy inplace merge void inplace_merge(bidirectionaliterator first, BidirectionalIterator middle, BidirectionalIterator last) void inplace_merge(bidirectionaliterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp) Działanie: Łączy dwa sąsiednie posortowane zakresy, [first, middle) oraz [middle, last), umieszczając wynik w zakresie [first, last) Parametry: first, middle, last iteratory specyfikujące zakresy comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: Brak Złożoność: O(n) jeśli jest dostępne wystarczająco dużo dodatkowej pamięci (n łączna liczba elementów) O(n log n) jeśli jest dostępne wystarczająco dużo dodatkowej pamięci (n łączna liczba elementów) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 46 / 83

Algorytmy zbiorowe includes bool includes(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2) bool includes(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp) Działanie: Sprawdza czy wszystkie elementy zakresu [first2, last2) występują w zakresie [first1, last1) Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: true jeśli wszystkie elementy drugiego zakresu występują w większym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: Jeśli drugi zakres zawiera kilka wystąpień tego samego elementu, to pierwszy zakres musi zawierać przynajmniej tyle samo wystąpień tego elementu, żeby wynikiem mogło być true Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 47 / 83

Algorytmy zbiorowe set union OutputIterator set_union(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) Działanie: Łączy dwa zakresy, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w przynajmniej jednym z zakresów. Liczba wystąpień każdego z elementów w zakresie docelowym jest większą z liczb wystąpień w zakresach źródłowych. Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 48 / 83

Algorytmy zbiorowe set union OutputIterator set_union(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) Działanie: Łączy dwa zakresy, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w przynajmniej jednym z zakresów. Liczba wystąpień każdego z elementów w zakresie docelowym jest większą z liczb wystąpień w zakresach źródłowych. Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 49 / 83

Algorytmy zbiorowe set intersection OutputIterator set_intersection(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) Działanie: Wykonuje przecięcie dwóch zakresów, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w obydwu z zakresów. Liczba wystąpień każdego z elementów w zakresie docelowym jest mniejszą z liczb wystąpień w zakresach źródłowych. Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 50 / 83

Algorytmy zbiorowe set intersection OutputIterator set_intersection(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) Działanie: Wykonuje przecięcie dwóch zakresów, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w obydwu z zakresów. Liczba wystąpień każdego z elementów w zakresie docelowym jest mniejszą z liczb wystąpień w zakresach źródłowych. Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 51 / 83

Algorytmy zbiorowe set difference OutputIterator set_difference(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) Działanie: Oblicza różnicę dwóch zakresów, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w pierwszym zakresie, ale nie występuje w drugim. Liczba wystąpień każdego z elementów w zakresie docelowym jest liczbą wystąpień w pierwszym zakresie pomniejszoną o liczbę wystąpień w drugim zakresie (bądź zerem). Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 52 / 83

Algorytmy zbiorowe set difference OutputIterator set_difference(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) Działanie: Oblicza różnicę dwóch zakresów, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w pierwszym zakresie, ale nie występuje w drugim. Liczba wystąpień każdego z elementów w zakresie docelowym jest liczbą wystąpień w pierwszym zakresie pomniejszoną o liczbę wystąpień w drugim zakresie (bądź zerem). Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 53 / 83

Algorytmy zbiorowe set symmetric difference OutputIterator set_symmetric_difference(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) Działanie: Oblicza symetryczną różnicę dwóch zakresów, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w dokładnie jednym z zakresów źródłowych. Liczba wystąpień każdego z elementów w zakresie docelowym jest różnicą liczby wystąpień w zakresach źródłowych (bądź zerem). Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 54 / 83

Algorytmy zbiorowe set symmetric difference OutputIterator set_symmetric_difference(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) Działanie: Oblicza symetryczną różnicę dwóch zakresów, [first1, last1) oraz [first2, last2), traktując je jak posortowane zbiory do zakresu docelowego element zostaje wpisany jeśli występuje w dokładnie jednym z zakresów źródłowych. Liczba wystąpień każdego z elementów w zakresie docelowym jest różnicą liczby wystąpień w zakresach źródłowych (bądź zerem). Wynik zapisuje w zakresie rozpoczynającym się od result. Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy źródłowe result początek zakresu docelowego comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany przy porównywaniu elementów zamiast operatora < Zwracana wartość: Iterator do pozycji za ostatnią w zakresie docelowym Złożoność: O((last1 first1) + (last2 first2)) Uwaga: brak kontroli zakresu (zakres docelowy musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 55 / 83

Algorytmy przykład Przykład #include <list> #include <vector> #include <algorithm> using namespace std; int main(int argc, char* argv[]) { string inf[] = {"PK1", "TA", "Mat", "Fiz", "Fil"}; string zarz[] = {"Eko", "WF", "Mat", "Ang", "Fil"}; vector<string> vi(inf, inf+5); vector<string> vz(zarz, zarz+5); list<string> lr; back_insert_iterator<list<string> > iter(lr); sort(vi.begin(), vi.end()); sort(vz.begin(), vz.end()); } // Lacznie przedmioty set_union(vi.begin(), vi.end(), vz.begin(), vz.end(), iter); ShowCollection(lr); // Ang Eko Fil Fiz Mat PK1 TA WF // Powtorzone przedmioty lr.clear(); set_intersection(vi.begin(), vi.end(), vz.begin(), vz.end(), iter); ShowCollection(lr); // Fil Mat // Tylko inf lr.clear(); set_difference(vi.begin(), vi.end(), vz.begin(), vz.end(), iter); ShowCollection(lr); // Fiz PK1 TA Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 56 / 83

Algorytmy kopcowe push heap void make_heap(randomaccessiterator first, RandomAccessIterator last) void make_heap(randomaccessiterator first, RandomAccessIterator last, Compare comp) Działanie: Przekształca zakres [first, last) w taki sposób, aby zawierał on elementy uporządkowane w postaci kopca Parametry: first, last iteratory specyfikujące zakres comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany zamiast operatora < jako relacja mniejszości Zwracana wartość: brak Złożoność: O(last first) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 57 / 83

Algorytmy kopcowe pop heap void pop_heap(randomaccessiterator first, RandomAccessIterator last) void pop_heap(randomaccessiterator first, RandomAccessIterator last, Compare comp) Działanie: Zamienia pierwszy element zakresu [first, last) z ostatnim i z elementów [first, last 1) tworzy kopiec Parametry: first, last iteratory specyfikujące zakres comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany zamiast operatora < jako relacja mniejszości Zwracana wartość: brak Złożoność: O(log(last first)) Uwaga: Przed wykonaniem algorytmu zakres [first, last) musi zawierać poprawny kopiec Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 58 / 83

Algorytmy kopcowe make heap void push_heap(randomaccessiterator first, RandomAccessIterator last) void push_heap(randomaccessiterator first, RandomAccessIterator last, Compare comp) Działanie: Dodaje element znajdujący się na pozycji last 1 do kopca znajdującego się w zakresie [first, last 1). Po wykonaniu algorytmu zakres [first, last) zawiera poprawny kopiec Parametry: first, last iteratory specyfikujące zakres comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany zamiast operatora < jako relacja mniejszości Zwracana wartość: brak Złożoność: O(log(last first)) Uwaga: Przed wykonaniem algorytmu zakres [first, last 1) musi zawierać poprawny kopiec Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 59 / 83

Algorytmy kopcowe sort heap void sort_heap(randomaccessiterator first, RandomAccessIterator last) void sort_heap(randomaccessiterator first, RandomAccessIterator last, Compare comp) Działanie: Sortuje elementy z zakresu [first, last) zawierającego kopiec Parametry: first, last iteratory specyfikujące zakres comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany zamiast operatora < jako relacja mniejszości Zwracana wartość: brak Złożoność: O(n log n), gdzie n = last first Uwaga: Przed wykonaniem algorytmu zakres [first, last) musi zawierać poprawny kopiec Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 60 / 83

Algorytmy przykład Przykład #include <vector> #include <algorithm> const int MAX = 9; using namespace std; int main(int argc, char* argv[]) { int tab[max] = {3, 5, 1, 4, 2, 9, 8, 6, 0}; vector<int> vi(tab, tab+max); ShowCollection(vi); // 3 5 1 4 2 9 8 6 0 make_heap(vi.begin(), vi.end()); ShowCollection(vi); // 9 6 8 5 2 1 3 4 0 pop_heap(vi.begin(), vi.end()); ShowCollection(vi); // 8 6 3 5 2 1 0 4 9 *vi.rbegin() = 7; push_heap(vi.begin(), vi.end()); ShowCollection(vi); // 8 7 3 6 2 1 0 4 5 } sort_heap(vi.begin(), vi.end()); ShowCollection(vi); // 0 1 2 3 4 5 6 7 8 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 61 / 83

Algorytmy lexicographical compare bool bool lexicographical_compare(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2) lexicographical_compare(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp) Działanie: Sprawdza czy elementy zakresu [first1, last1) są leksykograficznie mniejsze od elementów zakresu [first2, last2) Parametry: first1, last1, first2, last2 iteratory specyfikujące zakresy comp predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) stosowany zamiast operatora < jako relacja mniejszości Zwracana wartość: true jeśli pierwszy zakres zawiera elementy leksykograficznie mniejsze od elementów drugiego zakresu Złożoność: O(min(last1 first1, last2 first2)) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 62 / 83

Algorytmy matematyczne accumulate T accumulate(inputiterator first, InputIterator last, T init) Działanie: Wyznacza sumę wszystkich elementów zakresu [first, last) oraz wartości init Parametry: first, last iteratory specyfikujące zakres init wartość dodawana do sumy wszystkich elementów Zwracana wartość: Suma wszystkich elementów zakresu i wartości init Złożoność: O(last first) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 63 / 83

Algorytmy matematyczne accumulate T accumulate(inputiterator first, InputIterator last, T init) T accumulate(inputiterator first, InputIterator last, T init, BinaryOperation binary_op) Działanie: Oblicza wynik działania init = binary_op(init, *i) wykonywanego kolejno dla wszystkich elementów z zakresu [first, last) Parametry: first, last iteratory specyfikujące zakres init wartość początkowa binary_op predykat binarny (obiekt funkcyjny bądź wskaźnik na funkcję) wykonywany zamiast sumowania elementów Zwracana wartość: Wynik działania predykatu binarnego dla kolejnych elementów Złożoność: O(last first) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 64 / 83

Algorytmy matematyczne inner product T inner_product(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, T init) Działanie: Oblicza wartość iloczynu skalarnego zakresu [first1, last1) oraz zakresu rozpoczynającego się od first2 powiększoną o wartość init Parametry: first1, last1, first2 iteratory specyfikujące zakresy init wartość dodawana do sumy wszystkich elementów zakresu Zwracana wartość: Wartość iloczynu skalarnego powiększona o init Złożoność: O(last1 first1) Uwaga: Brak kontroli zakresów (drugi zakres musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 65 / 83

Algorytmy matematyczne inner product T inner_product(inputiterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2) Działanie: Oblicza wartość iloczynu skalarnego zakresu [first1, last1) oraz zakresu rozpoczynającego się od first2 powiększoną o wartość init przy czym zamiast operacji mnożenia elementów wykonywany jest binarny predykat binary_op2 a zamiast operacji dodawania wykonywany jest predykat binary_op1 Parametry: first1, last1, first2 iteratory specyfikujące zakresy init wartość dodawana do sumy wszystkich elementów zakresu binary_op1 binarny predykat wykonywany zamiast dodawania binary_op2 binarny predykat wykonywany zamiast mnożenia Zwracana wartość: Wartość iloczynu skalarnego powiększona o init Złożoność: O(last1 first1) Uwaga: Brak kontroli zakresów (drugi zakres musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 66 / 83

Algorytmy matematyczne partial sum OutputIterator partial_sum(inputiterator first, InputIterator last, OutputIterator result) OutputIterator partial_sum(inputiterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op) Działanie: Oblicza sumy częściowe dla zakresu [first, last) a wyniki zapisuje do zakresu rozpoczynającego się od result, tj. i ty element zakresu docelowego zawiera sumę elementów od początkowego do i-tego z zakresu źródłowego Parametry: first, last, result iteratory specyfikujące zakresy binary_op binarny predykat (obiekt funkcyjny bądź wskaźnik na funkcję) wykonywany zamiast operacji dodawania Zwracana wartość: Iterator do pozycji za ostatnią z zakresu docelowego Złożoność: O(last first) Uwaga: Brak kontroli zakresów (drugi zakres musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 67 / 83

Algorytmy matematyczne adjacent difference OutputIterator adjacent_difference(inputiterator first, InputIterator last, OutputIterator result) OutputIterator adjacent_difference(inputiterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op) Działanie: Dla każdego elementu z zakresu [first, last) oblicza różnicę między tym elementem i elementem poprzednim, a wynik zapisuje do zakresu docelowego rozpoczynającego się od result. Ponieważ pierwszy element nie ma poprzednika, to jest on kopiowany do zakresu docelowego Parametry: first, last, result iteratory specyfikujące zakresy binary_op binarny predykat (obiekt funkcyjny bądź wskaźnik na funkcję) wykonywany zamiast operacji odejmowania Zwracana wartość: Iterator do pozycji za ostatnią z zakresu docelowego Złożoność: O(last first) Uwaga: Brak kontroli zakresów (drugi zakres musi być dostatecznie duży) Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 68 / 83

Plan wykładu 1 Iteratory Funkcje pomocnicze iteratorów Iteratory odwrotne Iteratory wstawiające Iteratory strumieniowe 2 Algorytmy Algorytmy modyfikujące Algorytmy sortowania i pochodne Algorytmy zbiorowe Algorytmy kopcowe Algorytmy inne Algorytmy matematyczne 3 Kolekcje niestandardowe SGI STL, STLPort, Borland C++ Builder 6+ MS Visual C++ C++ TR1 Sebastian Deorowicz (PŚl) Algorytmy, iteratory, kolekcje niestandardowe 2006 11 06 69 / 83