Boost, Metaprogramowanie, Inne biblioteki

Podobne dokumenty
Szablony funkcji i szablony klas

Programowanie i struktury danych

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

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

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

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

Język C++ wykład VIII

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

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

Szablony. Szablony funkcji

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

Programowanie - wykład 4

Szablony funkcji i klas (templates)

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Wstęp do programowania

Kurs programowania. Wykład 9. Wojciech Macyna

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

Wprowadzenie do szablonów klas

Wstęp do Programowania 2

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Zaawansowane programowanie w C++ (PCP)

Język ludzki kod maszynowy

Programowanie Komponentowe Zarządzanie obiektami: kontenery

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

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

PROGRAMOWANIE GENERYCZNE W JĘZYKU C++

C++ wprowadzanie zmiennych

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

Paradygmaty programowania

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

TEMAT : KLASY POLIMORFIZM

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Iteratory, Alokatory, Przyszłość C++, Boost

Część 4 życie programu

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Projektowanie klas c.d. Projektowanie klas przykład

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wzorce funkcji (szablony)

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

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

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

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

Algorytmy, iteratory, kolekcje niestandardowe

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.

Rekurencja. Przygotowała: Agnieszka Reiter

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Obsługa wyjątków. Język C++ WW12

STL: Lekcja 1&2. Filozofia STL

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

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

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

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Programowanie obiektowe i C++ dla matematyków

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

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

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

12. Rekurencja. UWAGA Trzeba bardzo dokładnie ustalić <warunek>, żeby mieć pewność, że ciąg wywołań się zakończy.

Wyjątki (exceptions)

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

Wstęp do informatyki- wykład 11 Funkcje

10.1 Szablony Szablony funkcji Szablony klas Szablony jako wstęp do biblioteki STL... 10

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

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

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

Wstęp do informatyki- wykład 9 Funkcje

I - Microsoft Visual Studio C++

Pytanie 1. Pytanie 2. Pytanie 3 WOJEWÓDZKI KONKURS INFORMATYCZNY. Treść pytania

Szablon klasy std::vector

obiekty funkcyjne - funktory

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

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

Algorytmy i złożoności Wykład 5. Haszowanie (hashowanie, mieszanie)

Wstęp do programowania

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

Język C++ Różnice między C a C++

Program 14. #include <iostream> #include <ctime> using namespace std;

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Algorytmy i język C++

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

Mechanizm dziedziczenia

Technologie cyfrowe semestr letni 2018/2019

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

Wprowadzenie do programowania i programowanie obiektowe

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Wstęp do programowania. Wykład 1

Operacje wejścia/wyjścia odsłona pierwsza

Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy

Zadanie 2: Arytmetyka symboli

Transkrypt:

Boost, Metaprogramowanie, Inne biblioteki Biblioteka STL Sebastian Deorowicz Politechnika Śląska 2006 11-20 Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 1 / 38

Plan wykładu 1 Biblioteka Regex (Boost) 2 Biblioteka Graph (Boost) 3 Metaprogramowanie Wprowadzenie Coś poważniejszego Inne podejście 4 Inne biblioteki LEDA Blitz++ Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 2 / 38

Plan wykładu 1 Biblioteka Regex (Boost) 2 Biblioteka Graph (Boost) 3 Metaprogramowanie Wprowadzenie Coś poważniejszego Inne podejście 4 Inne biblioteki LEDA Blitz++ Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 3 / 38

Biblioteka regex (Boost) Opis Standardowy język C++ nie udostępnia możliwości stosowania wyrażeń regularnych Biblioteka regex (należąca do bibliotek Boost) wypełnia tę lukę Biblioteka dostępna jest na darmowej licencji Czym się teraz zajmiemy? Podobnie jak w przypadku innych bibliotek Boost, regex nie zostanie omówiona w całości Celem wykładu jest zaprezentowanie niektórych jej możliwości i zachęcenie do samodzielnego zgłębienia szczegółów więcej informacji: http://www.boost.org/libs/regex/doc/index.html B. Karlsson, Więcej niż C++. Wprowadzenie do bibliotek Boost, Helion, 2006 Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 4 / 38

Biblioteka regex wyrażenia regularne Litery, cyfry, inne znaki 1 Każdy symbol jest dopasowywany z takim samym z wyjątkiem znaków specjalnych:. dowolny znak [ definiuje zakresy symboli, np. [xyz] dowolny z symboli xyz, [x-z] to samo { definiuje liczbę powtórzeń: {n} poprzedni znak powinien wystąpić n razy {n,} poprzedni znak powinien wystąpić co najmniej n razy {n,m} poprzedni znak powinien wystąpić co najmniej n ale nie więcej niż m razy (, ) definiują podwyrażenie, które może być później używane w dalszym ciągu wyrażenia regularnego * poprzedni znak powinien wystąpić zero bądź więcej razy + poprzedni znak powinien wystąpić raz bądź więcej razy? poprzedni znak powinien wystąpić zero raz bądź raz alternatywa pomiędzy dwoma możliwościami ˆ początek wiersza $ koniec wiersza 1 Wykaz obejmuje najważniejsze elementy wyrażeń regularnych, ale nie jest kompletny Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 5 / 38

Biblioteka regex przykład Przykład #include "stdafx.h" #include <boost/regex.hpp> #include <iostream> #include <string> using namespace std; using namespace boost; int _tmain(int argc, _TCHAR* argv[]) { string slowo("alicja"); regex reg("[a-za-z]+"); regex reg_nip("\\d{3}-\\d{3}-\\d{2}-\\d{2}"); string NIP1("645-000-01-02"); string NIP2("645-00-101-02"); string NIP3("645-00-01-102"); regex reg_nip_alt("\\d{3}-(\\d{3}-\\d{2}-\\d{2} \\d{2}-\\d{2}-\\d{3})"); } cout << regex_match(slowo, reg) << endl; // 1 cout << regex_match(nip1, reg_nip) << endl; // 1 cout << regex_match(nip2, reg_nip) << endl; // 0 cout << regex_match(nip3, reg_nip) << endl; // 0 cout << regex_match(nip1, reg_nip_alt) << endl; // 1 cout << regex_match(nip2, reg_nip_alt) << endl; // 0 cout << regex_match(nip3, reg_nip_alt) << endl; // 1 Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 6 / 38

Biblioteka regex Wersje składni wyrażeń regularnych Perl domyślna POSIX extended kompatybilna z egrep i awk POSIX basic kompatybilna z grep i emacs Wersje składni ciągów formatujących przy zastępowaniu znaków Sed Perl Boost-Extended Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 7 / 38

Biblioteka regex algorytmy regex match Sprawdza czy podany ciąg jest zgodny z wyrażeniem regularnym Istnieje kilka przeciążonych wersji tej funkcji, np. ciąg może być typu string, może być określony iteratorami regex search Sprawdza czy w podanym ciągu występuje fragment dający się dopasować do wyrażenia regularnego regex replace Wyszukuje w podanym ciągu wszystkie dopasowania podanego ciągu i zamienia je na podany ciąg Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 8 / 38

Biblioteka regex algorytmy regex match Sprawdza czy podany ciąg jest zgodny z wyrażeniem regularnym Istnieje kilka przeciążonych wersji tej funkcji, np. ciąg może być typu string, może być określony iteratorami regex search Sprawdza czy w podanym ciągu występuje fragment dający się dopasować do wyrażenia regularnego regex replace Wyszukuje w podanym ciągu wszystkie dopasowania podanego ciągu i zamienia je na podany ciąg Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 8 / 38

Biblioteka regex algorytmy regex match Sprawdza czy podany ciąg jest zgodny z wyrażeniem regularnym Istnieje kilka przeciążonych wersji tej funkcji, np. ciąg może być typu string, może być określony iteratorami regex search Sprawdza czy w podanym ciągu występuje fragment dający się dopasować do wyrażenia regularnego regex replace Wyszukuje w podanym ciągu wszystkie dopasowania podanego ciągu i zamienia je na podany ciąg Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 8 / 38

Biblioteka regex algorytmy Przykład #include "stdafx.h" #include <boost/regex.hpp> #include <iostream> #include <string> using namespace std; using namespace boost; int _tmain(int argc, _TCHAR* argv[]) { string s("ala ma kota, ale kot nie lubi Ali, za to lubi Asię"); regex reg("(a)(l[a-za-z])", regex::perl); s = regex_replace(s, reg, "O$2"); cout << s << endl; } // Ola ma kota, ale kot nie lubi Oli, za to lubi Asię Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 9 / 38

Biblioteka regex iteratory Przykład #include "stdafx.h" #include <algorithm> #include <boost/regex.hpp> #include <iostream> #include <string> using namespace std; using namespace boost; bool regex_callback(const boost::match_results<std::string::const_iterator>& x) { cout << x[0].str() << endl; return true; } int _tmain(int argc, _TCHAR* argv[]) { string s("firma usługowa 652-050-15-51\n652 Kowalski i spółka 625-15-54-505 (0-32)282-05-65"); regex reg_nip("\\d{3}-(\\d{3}-\\d{2}-\\d{2} \\d{2}-\\d{2}-\\d{3})"); sregex_iterator p(s.begin(), s.end(), reg_nip); sregex_iterator end; } for_each(p, end, &regex_callback); // 652-050-15-51 625-15-54-505 Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 10 / 38

Plan wykładu 1 Biblioteka Regex (Boost) 2 Biblioteka Graph (Boost) 3 Metaprogramowanie Wprowadzenie Coś poważniejszego Inne podejście 4 Inne biblioteki LEDA Blitz++ Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 11 / 38

Biblioteka graph Możliwości Reprezentacja grafów w pamięci komputera Spora biblioteka gotowych algorytmów takich jak np. algorytm Dijkstry algorytm Floyda Warshalla algorytm Kruskala przeszukiwanie grafu wszerz i w głąb kolorowanie grafu Nieco trudniejsza w użyciu za to wydajnie zaimplementowana Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 12 / 38

Biblioteka graph (cz.1) 2 #include "stdafx.h" #include <iostream> #include <cstdio> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/breadth_first_search.hpp> #include <boost/pending/integer_range.hpp> #include <boost/pending/indirect_cmp.hpp> using namespace boost; template <typename TimeMap> class bfs_time_visitor:public default_bfs_visitor { typedef typename property_traits<timemap>::value_type T; public: bfs_time_visitor(timemap tmap, T & t):m_timemap(tmap), m_time(t) { } template <typename Vertex, typename Graph> void discover_vertex(vertex u, const Graph & g) const { put(m_timemap, u, m_time++); } TimeMap m_timemap; T & m_time; }; 2 Przykład z http://www.boost.org/libs/graph/example/bfs-example.cpp Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 13 / 38

Biblioteka graph (cz.2) int _tmain(int argc, _TCHAR* argv[]) { // Select the graph type we wish to use typedef adjacency_list<vecs, vecs, undirecteds> graph_t; // Set up the vertex IDs and names enum {r, s, t, u, v, w, x, y, N}; const char *name = "rstuvwxy"; // Specify the edges in the graph typedef std::pair < int, int >E; E edge_array[] = { E(r, s), E(r, v), E(s, w), E(w, r), E(w, t), E(w, x), E(x, t), E(t, u), E(x, y), E(u, y) }; // Create the graph object const int n_edges = sizeof(edge_array) / sizeof(e); typedef graph_traits<graph_t>::vertices_size_type v_size_t; graph_t g(edge_array, edge_array + n_edges, v_size_t(n)); // Typedefs typedef graph_traits<graph_t>::vertex_descriptor Vertex; typedef graph_traits<graph_t>::vertices_size_type Size; typedef Size* Iiter; // a vector to hold the discover time property for each vertex std::vector<size> dtime(num_vertices(g)); Size time = 0; bfs_time_visitor<size*>vis(&dtime[0], time); breadth_first_search(g, vertex(s, g), visitor(vis)); // Use std::sort to order the vertices by their discover time std::vector<graph_traits<graph_t>::vertices_size_type > discover_order(n); integer_range < int >range(0, N); std::copy(range.begin(), range.end(), discover_order.begin()); std::sort(discover_order.begin(), discover_order.end(), indirect_cmp<iiter, std::less<size> >(&dtime[0])); std::cout << "order of discovery: "; for (int i = 0; i < N; ++i) std::cout << name[discover_order[i]] << " "; std::cout << std::endl; } Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 14 / 38

Plan wykładu 1 Biblioteka Regex (Boost) 2 Biblioteka Graph (Boost) 3 Metaprogramowanie Wprowadzenie Coś poważniejszego Inne podejście 4 Inne biblioteki LEDA Blitz++ Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 15 / 38

Metaprogramowanie Czym jest metaprogramowanie? Tworzenie programów wykonywanych w czasie kompilacji Metaprogram modyfikuje kod programu Polecana literatura D. Vandevoorde, N. Josuttis, C++. Szablony. Vademecum profesjonalisty, Helion, 2003. D. Abrahams, A. Gurtovoy, Język C++. Metaprogramowanie za pomocą szablonów, Helion, 2005. Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 16 / 38

Metaprogramowanie Czym jest metaprogramowanie? Tworzenie programów wykonywanych w czasie kompilacji Metaprogram modyfikuje kod programu Polecana literatura D. Vandevoorde, N. Josuttis, C++. Szablony. Vademecum profesjonalisty, Helion, 2003. D. Abrahams, A. Gurtovoy, Język C++. Metaprogramowanie za pomocą szablonów, Helion, 2005. Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 16 / 38

Metaprogramowanie (przykłady) silnia Przykład unsigned factorial_fun(unsigned n) { int r; for(r = 1; n > 0; n--) r *= n; return r; }... cout << factorial_fun(5) << endl; // 120 Opis Funkcja wykonywana jest w trakcie działania programu Złożoność liniowa względem parametru Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 17 / 38

Metaprogramowanie (przykłady) silnia Przykład template<unsigned N> inline unsigned factorial(void) { return factorial<n-1>() * N; } template<> inline unsigned factorial<0>(void) { return 1; }... cout << factorial<5>() << endl; // 120 cout << factorial<10>() << endl; // 3628800 Opis Metafunkcja wykonywana jest w trakcie kompilacji W czasie działania programu podstawiany jest tylko konkretny wynik złożoność stała Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 18 / 38

Programowanie a metaprogramowanie Funkcja Jest obliczana w trakcie działania programu Może być wywoływana z parametrem znanym dopiero w czasie działania programu Zajmuje niewiele miejsca w kodzie Metafunkcja Jest obliczana w trakcie kompilacji programu w trakcie działania programu wywołanie sprowadza się do podstawienia wyniku Może być wywoływana tylko z parametrem znanym w czasie kompilacji Muszą istnieć specjalizacje dla wszystkich wartości parametrów użytych w programie Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 19 / 38

Metaprogramowanie Jak przerabiać kod na metakod? Do dyspozycji mamy wzorce Parametrami nie-typami wzorca mogą być tylko liczby całkowite Metaprogramowanie za pomocą wzorców bazuje na rekurencji algorytm musi być (albo musi się dać przerobić na) rekurencyjny Problem Wzorce funkcji nie mogą być specjalizowane tylko częściowo nie był to problem dla funkcji silnia, ale już przy potęgowaniu tak łatwo się nie da Rozwiązanie Wzorce klas mogą być specjalizowane częściowo trzeba przejść z funkcji na klasy Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 20 / 38

Metaprogramowanie Jak przerabiać kod na metakod? Do dyspozycji mamy wzorce Parametrami nie-typami wzorca mogą być tylko liczby całkowite Metaprogramowanie za pomocą wzorców bazuje na rekurencji algorytm musi być (albo musi się dać przerobić na) rekurencyjny Problem Wzorce funkcji nie mogą być specjalizowane tylko częściowo nie był to problem dla funkcji silnia, ale już przy potęgowaniu tak łatwo się nie da Rozwiązanie Wzorce klas mogą być specjalizowane częściowo trzeba przejść z funkcji na klasy Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 20 / 38

Metaprogramowanie Jak przerabiać kod na metakod? Do dyspozycji mamy wzorce Parametrami nie-typami wzorca mogą być tylko liczby całkowite Metaprogramowanie za pomocą wzorców bazuje na rekurencji algorytm musi być (albo musi się dać przerobić na) rekurencyjny Problem Wzorce funkcji nie mogą być specjalizowane tylko częściowo nie był to problem dla funkcji silnia, ale już przy potęgowaniu tak łatwo się nie da Rozwiązanie Wzorce klas mogą być specjalizowane częściowo trzeba przejść z funkcji na klasy Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 20 / 38

Metaprogramowanie (przykłady) potęgowanie Przykład template<unsigned X, unsigned Y> struct power { static unsigned const value = X * power<x,y-1>::value; }; template<unsigned X> struct power<x, 0> { static unsigned const value = 1; };... cout << power<2,5>::value << endl; cout << power<5,4>::value << endl; Co się tu dzieje? Klasa nie może zwracać wyniku, ale może mieć pola statyczne Pola te istnieją niezależnie od tego czy mamy obiekty klas Klasa jest tzw. otoczką zmiennej Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 21 / 38

Metaprogramowanie (przykłady) potęgowanie Czy jest ono kosztowne? W czasie wykonywania wiele nas nie kosztuje W czasie kompilacji dla potęgi trzeba wyznaczyć stworzyć konkretyzacje wszystkich niższych potęg Przykład To samo można jednak zrobić nieco lepiej template<unsigned X, unsigned Y> struct power2 { static unsigned const value = power2<x,y/2>::value * power2<x,(y-y/2)>::value; }; template<unsigned X> struct power2<x, 1> { static unsigned const value = X; }; template<unsigned X> struct power2<x, 0> { static unsigned const value = 1; };... cout << power<2,5>::value << endl; cout << power<5,4>::value << endl; Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 22 / 38

Metaprogramowanie (przykłady) potęgowanie Czy jest ono kosztowne? W czasie wykonywania wiele nas nie kosztuje W czasie kompilacji dla potęgi trzeba wyznaczyć stworzyć konkretyzacje wszystkich niższych potęg Przykład To samo można jednak zrobić nieco lepiej template<unsigned X, unsigned Y> struct power2 { static unsigned const value = power2<x,y/2>::value * power2<x,(y-y/2)>::value; }; template<unsigned X> struct power2<x, 1> { static unsigned const value = X; }; template<unsigned X> struct power2<x, 0> { static unsigned const value = 1; };... cout << power<2,5>::value << endl; cout << power<5,4>::value << endl; Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 22 / 38

Metaprogramowanie Inny problem Spróbujmy obliczać wartości współczynników dwumianowych Zrobimy to na podstawie trójkąta Pascala, tj. wykorzystamy zależność: ( ) ( ) ( ) n n 1 n 1 = + k k 1 k Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 23 / 38

Metaprogramowanie współczynniki dwumianowe (metaprogram) Przykład template<unsigned N, unsigned K> struct slow_binomial { static unsigned const value = slow_binomial<n-1,k-1>::value + slow_binomial<n-1,k>::value; }; template<unsigned N> struct slow_binomial<n, 0> { static unsigned const value = 1; }; template<unsigned N> struct slow_binomial<n, N> { static unsigned const value = 1; }; template<> struct slow_binomial<0, 0> { static unsigned const value = 1; };... cout << slow_binomial<10,5>::value << endl; Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 24 / 38

Metaprogramowanie współczynniki dwumianowe Czy to dużo kosztuje? Trzeba wykonać O(nk) konkretyzacji bo obliczenie wykonywane jest za pomocą trójkąta Pascala Czy można lepiej? Oczywiście wystarczy liczyć współczynnik ze wzoru: n! n(n 1) (k + 1) = k!(n k)! (n k)(n k 1) 1 Dzięki temu potrzebnych będzie tylko O(n) specjalizacji Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 25 / 38

Metaprogramowanie współczynniki dwumianowe (wersja 2) Przykład template<unsigned N, unsigned K> struct partial_factorial { static unsigned const value = N * partial_factorial<n-1,k>::value; }; template<unsigned N> struct partial_factorial<n,n> { static unsigned const value = 1; }; template<unsigned N, unsigned K> struct fast_binomial { static unsigned const value = partial_factorial<n,k>::value / partial_factorial<n-k,0>::value; };... cout << fast_binomial<10,5>::value << endl; Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 26 / 38

Metaprogramowanie współczynniki dwumianowe Porównanie wersji Wersja 1 generuje dużo więcej kodu niż wersja 2 Wersja 2 może dawać błędne wyniki nawet jeśli wynik jest w zakresie int, bo wyniki cząstkowe (w liczniku i w mianowniku) mogą przekroczyć zakres Wersja 1 da poprawny wynik końcowy jeśli tylko mieści się on w zakresie int Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 27 / 38

Metaprogramowanie Opis Do tej pory tworzyliśmy metafunkcje w pełni obliczane w czasie kompilacji Możliwe jest jednak też tworzenie metafunkcji tylko częściowo obliczanych w czasie kompilacji ich parametrami są wartości znane dopiero w czasie wykonywania programu Takie metafunkcje sprowadzają się więc w zasadzie do wygenerowania efektywnego kodu na podstawie znanych niektórych parametrów problemu Problem Zabierzmy się za sortowanie Istnieje wiele algorytmów sortowania, ale wybierzemy sortowanie przez proste wstawianie, ponieważ dla małych danych jest ono bardzo wydajne wydajniejsze niż sortowanie szybkie Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 28 / 38

Metaprogramowanie sortowanie przez wstawianie Przykład void insertion_sort(int *A, int n) { for(int i = 1; i < n; i++) { int x = A[i]; int j; for(j = i-1; j >= 0 && A[j] > x; j--) A[j+1] = A[j]; A[j+1] = x; } } Problem Brak rekurencji, więc trzeba ten kod najpierw przerobić na szczęście pętle się bardzo łatwo przerabia Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 29 / 38

Metaprogramowanie sortowanie przez wstawianie Przykład int inline inner_loop(int *A, const int n, const int x) { if(n >= 0) { if(a[n] > x) { A[n+1] = A[n]; return inner_loop(a, n-1, x); } else return n; } return -1; } void insertion_sort2(int *A, int n) { for(int i = 1; i < n; i++) { int x = A[i]; int j = inner_loop(a, i-1, x); A[j+1] = x; } } Co teraz? Teraz przejdziemy na metaprogram, w którym rozmiar tablicy będzie parametrem wzorca Dane do sortowania będą parametrem funkcji Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 30 / 38

Metaprogramowanie sortowanie przez wstawianie (wersja 1) Przykład template<int N> int inline inner_loop(int *A, const int x) { if(a[n] > x) { A[N+1] = A[N]; return inner_loop<n-1>(a, x); } else return N; } template<> int inline inner_loop<-1>(int *A, const int x) { return -1; } template<int N> void inline insertion_sort(int *A) { insertion_sort<n-1>(a); int x = A[N-1]; A[inner_loop<N-2>(A, x)+1] = x; } template<> void inline insertion_sort<0>(int *A) {} template<> void inline insertion_sort<1>(int *A) {} Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 31 / 38

Metaprogramowanie sortowanie przez wstawianie (wersja 2) Przykład template<int N> inline void inner_loop(int *A) { if(a[n] < A[N-1]) { std::swap(a[n], A[N-1]); inner_loop<n-1>(a); } }; template<> inline void inner_loop<0>(int *A) {}; template<int N> inline void insertion_sort(int *A) { insertion_sort<n-1>(a); inner_loop<n-1>(a); }; template<> inline void insertion_sort<0>(int *A) {}; template<> inline void insertion_sort<1>(int *A) {}; Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 32 / 38

Metaprogramowanie testy porównawcze N = 10 funkcja 10.9ns metafunkcja (1) 4.7ns metafunkcja (2) 4.9ns sort. szybkie 20.0ns std::sort 17.0ns N = 16 funkcja 25.7ns metafunkcja (1) 12.7ns metafunkcja (2) 14.0ns sort. szybkie 34.6ns std::sort 30.3ns Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 33 / 38

Metaprogramowanie Biblioteka MPL Czym jest? Ogólna biblioteka wspomagająca metaprogramowanie Część Boost Zawiera sekwencje, iteratory, algorytmy (podobne do tych z STL) czasu kompilacji Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 34 / 38

Plan wykładu 1 Biblioteka Regex (Boost) 2 Biblioteka Graph (Boost) 3 Metaprogramowanie Wprowadzenie Coś poważniejszego Inne podejście 4 Inne biblioteki LEDA Blitz++ Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 35 / 38

LEDA Czym jest LEDA? Zaawansowana biblioteka struktur danych i algorytmów URL: www.leda.org Zalety Bardzo duża liczba gotowych struktur danych i algorytmów Duża wygoda użytkowania Wady Wysoka cena: kilka (kilkanaście) tysięcy Euro w zależności od wersji Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 36 / 38

Blitz++ Czym jest Blitz++? 3 Biblioteka specjalizowana dla obliczeń naukowych Dostępna na licencji GNU GPL 3 WWW: http://www.oonumerics.org/blitz/ Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 37 / 38

Co za tydzień? Spotykamy się o 12:15 w sali 732 w celu omówienia tematów projektów Sebastian Deorowicz (PŚl) Boost, Metaprogramowanie, Inne biblioteki 2006 11-20 38 / 38