1 Kurs języka C++ – wykład 13 (19.05.2014)Narzędzia programistyczne w bibliotece standardowej
2 Spis treści Standardowa biblioteka wzorców STL Pary i tupleSprytne wskaźniki Ograniczenia liczbowe Minimum i maksimum Zamiana zawartości obiektów Operatory porównywania Współczynniki Pomiar czasu Funkcje lambda
3 STL STL (ang. Standard Template Library) to standardowa biblioteka wzorców w C++. Wszystkie składniki STL są wzorcami. STL jest rdzeniem biblioteki standardowej C++. Wszystkie identyfikatory w bibliotece standardowej C++ zdefiniowane są w przestrzeni nazw std. Zaleta STL – mnóstwo gotowych szablonów klas pozwalających programować na wyższym poziomie abstrakcji. Wada STL – brak oczywistości (koniecznie czytaj dokumentację)
4 STL Biblioteka STL składa się z kilku modułów: strumienie we/wy,kontenery, iteratory, algorytmy, obiekty funkcyjne, łańcuchy, wyrażenia regularne, wielowątkowość i przetwarzanie współbieżne, internacjonalizacja, klasy narzędziowe.
5 Pary Szablon struktury pair<> (zdefiniowany w
6 Pary – przykłady void f(std::pair
7 Tuple W C++11 zdefiniowano tuple do przechowywania wielu wartości a nie tylko dwóch (szablon tuple<> jest analogią do szblony pary pair<>). Tupla posiada wiele ponumerowanych pól, do których dostęp mamy za pomocą metody get. Tupla posiada konstruktor wieloargumentowy oraz domyślny i kopiujący. Tuple można porównywać za pomocą operatorów porównań (porównywanie leksykograficzne). Istnieje szablon funkcji make_tuple() do tworzenia tupli (typy danych są rozpoznawane przez kompilator po typach argumentów). Istnieje szablon funkcji tie() do tworzenia tupli z referencjami (jako argumenty podaje się zmienne). Szablon tuple_size
8 Tuple – przykłady // create a four-element tuple // - elements are initialized with default value tuple
9 Tuple – przykłady // create tuple with make_tuple() // - auto declares t2 with type of right-hand side auto t2 = make_tuple(22,44,"nico"); // assign second value in t2 to t1 get<1>(t1) = get<1>(t2); // comparison and assignment // - including type conversion if (t1 < t2) { // compares value for value t1 = t2; // OK, assigns value for value }
10 Sprytne wskaźniki Sprytne wskaźniki są zdefiniowane w pliku nagłówkowym
11 Ograniczenia liczboweTypy numeryczne posiadają ograniczenia zależne od platformy i są zdefiniowane w szablonie numeric_limits<> (zdefiniowany w
12 Minimum i maksimum Obliczanie wartości minimalnej oraz maksymalnej: template
13 Minimum i maksimum Przykład 1: bool int_ptr_less (int *p, int *q) { return *p<*q; } … int x = 33, y = 44; int *px = &x, *py = &y; int *pmax = std::max(px,py,int_ptr_less); Przykład 2: int i; long l; … l = max(i,l); // BŁĄD // niezgodne typy argumentów l = std::max
14 Minimum i maksimum Funkcja minmax()zwraca parę elementów pair<>, gdzie pierwszy element jest minimum a drugi maksimum. Argumentem funkcji minmax()są dwa elementy albo lista elementów; ostatnim argumentem może być metoda porównująca. Przykład: bool int_ptr_less (int* a, int* b) { return *a < *b; } int x = 17, *px = &x; int y = 42, *py = &y; int z = 33, *pz = &z; std::pair
15 Zamiana zawartości obiektówZamiana dwóch wartości: template
16 Operatory porównywaniaCztery funkcje szablonowe (zdefiniowane w
17 Współczynniki W pliku nagłówkowym
18 Współczynniki – przykładytypedef ratio<25,15> FiveThirds; cout << FiveThirds::num << "/" << FiveThirds::den << endl; // 5/3 ratio<42,42> one; cout << one.num << "/" << one.den << endl; // 1/1 ratio<0> zero; cout << zero.num << "/" << zero.den << endl; // 0/1 typedef ratio<7,-3> Neg; cout << Neg::num << "/" << Neg::den << endl; // -7/3
19 Współczynniki Obliczenia na współczynnikach można wykonywać w trakcie kompilacji za pomocą następujących szablonów: ratio_add, ratio_subtract, ratio_multiply i ratio_divide (operacje arytmetyczne) oraz ratio_equal, ratio_not_equal, ratio_less, ratio_less_equal, ratio_greater i ratio_greater_equal (porównania). Przykład: ratio_add
20 Pomiar czasu Biblioteka standardowa wprowadza narzędzia pomocne do pomiaru czasu – są one zdefiniowane w pliku nagłówkowym
21 Pomiar czasu Przedział czasowy reprezentowany przez szablon std::chrono::duration<> jest liczbą określonych jednostek czasowych (mierzonych w sekundach). Przykłady: std::chrono::duration
22 Pomiar czasu Przedziały czasowe możemy porównywać, dodawać, odejmować, mnożyć i dzielić przez współczynniki oraz inkrementować i dekrementować o określoną jednostkę. Przykład: chrono::duration
23 Pomiar czasu Zegar definiuje epokę i długość tyknięcia zegara.W bibliotece standardowej zdefiniowane są trzy zegary: system_clock (z funkcjami to_time_t() oraz from_time_t()), steady_clock (nigdy nie korygowany) i high_resolution_clock (dokładny zegar systemowy). Bieżący czas można uzyskać za pomocą metody now(): auto system_start = chrono::system_clock::now(); Sprawdzenie czy upłynęła co najmniej minuta do startu: if (system_clock::now() > system_start minutes(1))
24 Pomiar czasu Punkt czasowy jest reprezentowany przez obiekt time_point. Pomiaru czasu można dokonać za pomocą punktów czasowych: auto t = steady_clock::now(); // ... do something ... auto d = steady_clock::now()−t; Konwersja punktu czasowego do postaci kalendarzowej: std::string asString (const std::chrono::system_clock::time_point &tp) { // convert to system time: std::time_t t = std::chrono::system_clock::to_time_t(tp); std::string ts = std::ctime(&t); // convert to calendar time ts.resize(ts.size()-1); // skip trailing newline return ts; }
25 Funkcje lambda Programista często chciałby zdefiniować predykatowe funkcje w pobliżu wywołań takich funkcji, jak na przykład pochodzących ze standardowej biblioteki
26 Funkcje lambda Funkcja lambda określa typ zwracanego wyniku za pomocą frazy -> TYP. Przykład: [](int x, int y) -> int { int z = x * x; return z + y + 1; } Jeśli ciało funkcji lambda składa się z jednej instrukcji return, to typ zwracanego wyniku będzie wydedukowany za pomocą decltype(). Przykład: [](int x, int y) // -> decltype(x*x+y+1) { return x * x + y + 1; }
27 Funkcje lambda …