Programowanie Obiektowe (język C++) Wykład 11. BIBLIOTEKA STANDARDOWA C++ Tomasz Marks - Wydział MiNI PW -1- Tomasz Marks - Wydział MiNI PW -2- Biblioteka standardowa C++ - Wprowadzenie Główne elementy biblioteki standardowej C++: biblioteka standardowa języka C, STL (Standard Template Library), obsługa strumieni wejścia/wyjścia, udogodnienia dla obliczeń numerycznych, standardowa obsługa błędów, obsługa umiędzynarodowienia. Biblioteka standardowa C++ nie obejmuje m.in.: wspomagania współbieŝności, narzędzi graficznego interfejsu uŝytkownika. Literatura uzupełniająca (Biblioteka standardowa C++) Nicolai M. Josuttis - C++ Biblioteka standardowa. Podręcznik programisty, Helion 2003 Scott Meyers - STL w praktyce. 50 sposobów efektywnego wykorzystania, Helion 2004 Ray Lischner - STL. Leksykon kieszonkowy, Helion 2004 www.sgi.com/tech/stl - Standard Template Library Programer's Guid, Silicon Graphics, Inc. 1993-2006 Tomasz Marks - Wydział MiNI PW -3- Tomasz Marks - Wydział MiNI PW -4-
complex<> Liczby zespolone - klasa complex<> UŜycie pliku nagłówkowego #include <complex> dostarcza definicję klasy (w standardowej przestrzeni nazw std) template <class T> class complex; oraz jej trzy specjalizacje template<> class complex<float>; template<> class complex<double>; template<> class complex<long double>; w celu optymalizacji i zapewnienia bezpieczeństwa konwersji. Tomasz Marks - Wydział MiNI PW -5- Tomasz Marks - Wydział MiNI PW -6- // complex_prog.cpp #include<iostream> #include<complex> using ; complex - przykład uŝycia int main ( ) complex<double> x ( 4., 5. ); complex<float> y ( polar ( 5.0, 0.80) ); cout << "x: " << x << endl; cout << "y: " << y << endl; cout << "x: modul : " << abs(x) << endl << " kwadrat modulu : " << norm(x) << endl << " kat fazy : " << arg(x) << endl; complex - oznaczenia pomocnicze W dalszej części opisu stosowane będą następujące konwencje oznaczeniowe: complex oznacza jeden z typów: complex<float> complex<double> complex<long double> c, c1, c2 - zmienne (obiekty) typu complex d, d1, d2 - wartości rzeczywiste cout << "x += sqrt(y) : " << x += sqrt(y) << endl; k - wartość całkowita Tomasz Marks - Wydział MiNI PW -7- Tomasz Marks - Wydział MiNI PW -8-
complex konstruktory, liczby tymcz. i operatory przypisania Konstruktory: complex c complex c ( d ) complex c ( d1, d2 ) complex c1 ( c2 ) Tymczasowe liczby zespolone: polar ( d ) - liczba tymczasowa o module d i kącie fazy 0; polar ( d1, d2 ) - liczba tymczasowa o module d1 i kącie fazy d2; conj ( c ) - liczba tymczasowa sprzęŝona do c; Operatory przypisania: c1 = c2 c1 += c2 c1 -= c2 c1 *= c2 c1 /= c2 c.real() real(c) c.imag() imag(c) abs(c) norm(c) arg(c) complex dostęp do wartości część rzeczywista część rzeczywista funkcja globalna część urojona część urojona funkcja globalna moduł liczby kwadrat modułu liczby kąt fazy: atan2 ( c.imag(), c.real() ) Tomasz Marks - Wydział MiNI PW -9- Tomasz Marks - Wydział MiNI PW -10- complex porównania Zdefiniowane są następujące operacje porównania: c1 == c2 c == d d == c c1!= c2 c!= d d!= c UWAGA: Inne operacje porównania (n.p. <, >= ) są niezdefiniowane. Tomasz Marks - Wydział MiNI PW -11- complex operatory arytmetyczne Zdefiniowane są następujące operacje arytmetyczne: c1 @ c2 c @ d d @ c gdzie @ oznacza jeden z dwuargumentowych operatorów: + - * / Ponad to: - c + c Tomasz Marks - Wydział MiNI PW -12-
complex funkcje przestępne Zdefiniowane są następujące funkcje przestępne: pow ( c, k ) pow ( c, d ) pow ( d, c ) pow ( c1, c2 ) sqrt ( c ) exp ( c ) log ( c ) log10 ( c ) sin ( c ) cos ( c ) tan ( c ) sinh (c ) cosh ( c ) tanh ( c ) complex strumieniowe operacje we/wy Operator wyjściowy: strm << c zapisuje do strumienia wyjścioweg strm liczbę zespoloną c w postaci: (CzęśćRzeczywista, CzęśćUrojona) --------------------------------------------------------------------------------------------------------------------- Operator wejściowy: strm >> c odczytuje ze strumienia wejścioweg strm liczbę zespoloną c zapisaną w jednej z poniŝszych postaci: (CzęśćRzeczywista, CzęśćUrojona) (CzęśćRzeczywista) CzęśćRzeczywista Tomasz Marks - Wydział MiNI PW -13- Tomasz Marks - Wydział MiNI PW -14- complex konwersje typów Konwersje typów kryją szereg pułapek i dlatego naleŝy korzystać z nich bardzo ostroŝnie. complex<float> zf; complex<double> zd; complex<long double> zld; complex<int> zi; complex<double> zd1 = zf; // O.K. konwersja bezpieczna complex<double> zd2 = zld; // BŁĄD! brak takiej niejawnej konwersji complex<double> zd3(zld); // O.K. konwersja jawna complex<double> zd4 = zi; // BŁĄD! brak takiej niejawnej konwersji complex<double> zd5(zi); // BŁĄD! brak takiej jawnej konwersji complex<double> zd6( zi.real(), zi.imag() ); // O.K. string UWAGA: T1 x; T2 y(x); T1 x; T2 y = x; // uŝywa konwersji jawnej // uŝywa konwersji niejawnej Tomasz Marks - Wydział MiNI PW -15- Tomasz Marks - Wydział MiNI PW -16-
Łańcuchy znakowe klasy..string.. UŜycie pliku nagłówkowego #include <string> dostarcza definicję klasy (w standardowej przestrzeni nazw std) template <class chart, class traits = char_traits<chart>, class Allocator = allocator<chart> > class basic_string; gdzie chart - określa typ danych pojedynczego znaku; traits - definiuje wszystkie operacje na znakach reprezentowanych w klasie chart; Allocator - model pamięci wykorzystywany przez klasę. Łańcuchy znakowe klasy..string.. W pliku string zdefiniowane są dwie specjalizacje klasy basic_string<> : typedef basic_string<char> string; typedef basic_string<wchar_t> wstring; Klasa string zastępuje łańcuchy znakowe języka C. Jest bezpieczna i wygodna w uŝyciu. Przeanalizujemy przykład zaczerpnięty z ksiąŝki Nicolai M. Josuttisa ( str. 437 ) - "Pobieranie słów i wypisywanie ich w odwrotnej kolejności" [znaków]. Tomasz Marks - Wydział MiNI PW -17- Tomasz Marks - Wydział MiNI PW -18- // string2.cpp #include<iostream> #include<string> using ; int main ( int argc, char** argv ) const string delims(" \t,.;"); string line; // dla kaŝdego prawidłowo odczytanego wiersza while ( getline( cin, line) ) string::size_type begind, endind; // odszukaj początek pierwszego słowa begind = line.find_first_not_of( delims ); string - przykład uŝycia (1) // jeŝeli odnaleziono początek słowa while ( begind!= string::npos ) // odszukaj koniec słowa endind = line.find_first_of( delims, begind ); if ( endind == string::npos ) // koniec słowa jest jednocześnie końcem wiersza endind = line.length(); // wypisz znaki w odwrotnej kolejności for ( int i = endind-1; i >= static_cast<int>(begind); --i ) cout << line[ i ]; cout << ' '; // odszukaj początek kolejnego słowa begind = line.find_first_not_of( delims, endind ); cout << endl; Tomasz Marks - Wydział MiNI PW -19- // string2.cpp #include<iostream> #include<string> using ; int main ( int argc, char** argv ) const string delims(" \t,.;"); string line; string - przykład uŝycia (2) // dla kaŝdego prawidłowo odczytanego wiersza while ( getline( cin, line) ) string::size_type begind, endind; // odszukaj początek pierwszego słowa begind = line.find_first_not_of( delims );.... cout << endl; Tomasz Marks - Wydział MiNI PW -20-
string - przykład uŝycia (3) // jeŝeli odnaleziono początek słowa while ( begind!= string::npos ) // odszukaj koniec słowa endind = line.find_first_of( delims, begind ); if ( endind == string::npos ) // koniec słowa jest jednocześnie końcem wiersza endind = line.length(); // wypisz znaki w odwrotnej kolejności for ( int i = endind-1; i >= static_cast<int>(begind); --i ) cout << line[ i ]; cout << ' '; // odszukaj początek kolejnego słowa begind = line.find_first_not_of( delims, endind );.. Operacje Konstruktory Destruktor =, assign() swap() +=, append(), push_back() insert() erase() clear() resize() string operacje (1) Wyniki tworzą lub kopiują łańcuch znakowy usuwa łańcuch znakowy przypisuje nową wartość zamienia wartości pomiędzy dwoma łańcuchami dołącza znaki na końcu łańcucha wstawia znaki usuwa znaki usuwa wszystkie znaki (czyści łańcuch) zmienia liczbę znaków (dołącza lub usuwa końcowe znaki) Tomasz Marks - Wydział MiNI PW -21- Tomasz Marks - Wydział MiNI PW -22- string operacje (2) string operacje (3) Operacje Wyniki Operacje Wyniki replace() zastępuje znaki >>, getline() odczyt ze strumienia + konkatenacja << zapis do strumienia ==,!=, <, <=, >, >=, compare() size(), length() max_size() empty() capacity() reserve() porównania zwraca aktualną liczbę znaków zwraca maksymalną moŝliwą liczbę znaków bool czy dany łańcuch jest pusty? zwraca maksymalną moŝliwą liczbę znaków, która moŝe być przechowywana bez ponownej alokacji pamięci rezerwuje pamięć na określoną liczbę znaków copy() c_str() data() substr() funkcje przeszukiwania begin(), end() rbegin(), rend() kopiuje string do łańcucha znakowego języka C zwraca wartość jako łańcuch znakowy języka C zwraca wartość w postaci tablicy znaków zwraca określony fragment łańcucha znakowego poszukują określonego łańcucha znakowego lub znaku obsługa iteratorów normalnych obsługa iteratorów odwrotnych [ ], at() umoŝliwia dostęp do znaku Tomasz Marks - Wydział MiNI PW -23- Tomasz Marks - Wydział MiNI PW -24-
Koniec wykładu 11. Tomasz Marks - Wydział MiNI PW -25-