IDZ DO PRZYK ADOWY ROZDZIA KATALOG KSI EK ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWO CIACH ZAMÓW CENNIK CZYTELNIA SPIS TRE CI KATALOG ONLINE DODAJ DO KOSZYKA FRAGMENTY KSI EK ONLINE STL. Leksykon kieszonkowy Autor: Ray Lischner T³umaczenie: Wojciech Moch ISBN: 83-7361-438-9 Tytu³ orygina³u: STL Pocket Reference Format: B5, stron: 132 Czy do wyszukania warto ci w danym zakresie nale y u yæ funkcji search() czy find()? Jakie argumenty ma funkcja list::splice? Kiedy wywo³ywaæ mem_fun, a kiedy mem_fun_ref? Zapewne jak wielu innych programistów masz k³opot z zapamiêtaniem tych wszystkich szczegó³ów, nawet je li codziennie u ywasz biblioteki STL. Ksi¹ ka Raya Lischnera STL. Leksykon kieszonkowy bêdzie dla Ciebie nieocenion¹ pomoc¹ -- w prosty sposób odpowiada na wszystkie takie pytania. W tej ksi¹ ce znajduj¹ siê opisy interfejsów kontenerów, iteratorów, algorytmów i obiektów funkcyjnych zawartych w bibliotece STL. Mo na w niej znale æ szczegó³y dotycz¹ce wywo³añ funkcji, typów zwracanych przez te funkcje, parametrów szablonów i wiele wiêcej. W po³¹czeniu z ksi¹ k¹ C++. Leksykon kieszonkowy, ksi¹ ka ta pozwala na spore oszczêdno ci czasu. Na pewno przyda siê w czasie pisania programów. STL to skondensowana wiedza i do wiadczenie, a ta ksi¹ ka to skondensowana biblioteka STL. Nie, nie po yczê swojego egzemplarza kup sobie w³asny! Andrew Duncan, Senior Software Engeneer, Expertcity Inc. Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl
Spis treści Wprowadzenie...5 Kontenery...8 Kontenery standardowe...a...9 Adaptory kontenerów...a...11 Wartości...a...11 Typowe składowe...a...12 Wyjątki...a...a.22 Kolejki...a...a..23 Listy...a...a...24 Mapy...a...a...28 Kolejki priorytetowe...a...29 Kolejki...a...a..31 Zbiory...a...a...32 Stosy...a...a...34 Ciągi znaków...a...35 Wektory...a...47 Iteratory...49 Kategorie iteratorów...a...50 Stosowanie iteratorów...a...51 Cechy iteratorów...a...54 Iteratory do stałej...a...55 Iteratory wstawiające...a...57 Iteratory strumieni wejścia-wyjścia...a...58 Iterator typu raw storage...a...65 Iteratory wsteczne...a...65 Szablony funkcji iteratorów...a...70 Algorytmy...70 Operacje niemodyfikujące...a...73 Porównania...a...73 Wyszukiwanie...a...76 Spis treści 3
Wyszukiwanie binarne...a...77 Operacje modyfikujące sekwencje...a...79 Operacje na niezainicjowanych sekwencjach...85 Sortowanie...a...86 Łączenie...a...88 Operacje na zbiorach...a...89 Operacje na stercie...a...91 Permutacje...a...93 Różne...a...a...93 Numeryczne...a...94 Funktory...95 Stosowanie funktorów...a...96 Podstawy funktorów...a...98 Adaptory...a...99 Funktory wiążące...a...102 Funktory arytmetyczne i logiczne...a...103 Funktory porównujące...a...105 Różne...106 Alokatory...a...106 Pola bitowe (bitset)...a...109 Pary...a...a...113 Sprytne wskaźniki...a...114 Boost...117 Tablice...a...a118 Dynamiczne pola bitowe...a...118 Funktory wiążące...a...119 Składanie funkcji...a...120 Adaptory...a...122 Zmiana pliku nagłówkowego Functional...122 Funkcje lambda...a...123 Sprytne wskaźniki...a...124 Skorowidz...125 4 STL. Leksykon kieszonkowy
Różne W tym rozdziale opisane zostaną szablony klas, i, których nie można przyporządkować do innych kategiorii. Alokatory Alokator jest rozwinięciem wyrażeń i. Standardowe kontenery stosują alokatory do alokowania i zwalniania pamięci a także do konstruowania i niszczenia obiektów zapisanych w kontenerze. Biblioteka standardowa definiuje szablon klasy, który jest domyślnym alokatorem wszystkich standardowych kontenerów. Możliwe jest zastosowanie innego alokatora pod warunkiem, że udostępnia on ten sam interfejs co alokator standardowy. Implementowanie nowego alokatora jest trudniejsze niż można by z początku sądzić i wykracza poza ramy tej książki. W tym podrozdziale zostaną opisane tylko sposoby zastosowania standardowego szablonu klasy. Poniżej opisane zostały typy składowe szablonu : Typ wskaźnika na stały element. Typ stałej l-wartości. 106
Typ reprezentujący różnicę między dowolnymi dwoma wskaźnikami zwróconymi przez alokator po wywołaniu funkcji. Typ wskaźnika. Wiąże obiekt alokatora z innym typem wartości. Klasa posiada jedną deklarację będącą instancją szablonu z typem, podanym w parametrze szablonu. Standardowe kontenery alokujące obiekty pomocnicze, takie jak węzły łączące, zamiast bezpośredniego alokowania wartości wykorzystują szablon. Osoby, które nie muszą implementować standardowych kontenerów, najprawdopodobniej nie będą też musiały znać sposobu działania tego szablonu. Typ l-wartości. Typ, który może reprezentować rozmiar największego żądania alokacji. Typ alokowanych wartości. Poniżej opisane zostały metody szablonu : Tworzy nowy obiekt alokatora kopiując, jeżeli to możliwe, istniejący alokator. Zwraca adres elementu, czyli wartość. Różne 107
W celu zaalokowania pamięci wystarczającej do przechowania elementów typu, wywołuje globalny operator. Argument musi mieć wartość 0 lub wartość wskaźnika uzyskanego z innego wywołania funkcji, którego nie przekazano jeszcze do funkcji. Zwracany jest wskaźnik na zaalokowaną właśnie pamięć. Jeżeli nie można zaalokować wystarczającej ilości pamięci, zgłaszany jest wyjątek. Za pomocą globalnego operatora tworzy kopię wartości i umieszcza ją pod adresem. Zwalnia pamięć wskazywaną przez poprzez wywołanie globalnego operatora. Argument przechowuje liczbę elementów typu ta sama wartość przekazana była do funkcji. Wywołuje destruktor obiektu umieszczonego pod adresem. Oznacza to, że wykonywane jest wywołanie. Zwraca maksymalny rozmiar, który można przekazać funkcji. Standard definiuje specjalizowany szablon, który nie deklaruje funkcji, itd., ponieważ nie jest możliwe utworzenie obiektu typu. Możliwe jest jednak stosowanie jego składowych, i. Operatory równości ( i ) są przeciążane w ten sposób, że wszystkie obiekty typu są sobie równe niezależnie od typu alokowanych wartości. 108 STL. Leksykon kieszonkowy
Pola bitowe (bitset) Obiekty typu są spakowanymi sekwencjami bitów o stałej wielkości. Nie są to standardowe kontenery, nie udostępniają też iteratorów. Szablon klasy (zadeklarowany jest w pliku nagłówkowym ) pobiera pojedynczy parametr określający liczbę przechowywanych bitów. Pojedynczy bit może zostać ustawiony na wartość jedynki (funkcja ) lub zera (funkcja ). Możliwa jest też zmiana wartości bitu z jedynki na zero i z zera na jedynkę, umożliwia to funkcja. Poniżej zostały opisane metody szablonu : Tworzy obiekt typu z wszystkimi bitami wyzerowanymi. Tworzy obiekt typu inicjalizując pierwszych bitów wartością, gdzie. Jeżeli, to wszystkie pozostałe bity są ustawiane na wartość zero. Jeżeli, to nadmiarowe bity są ignorowane. Tworzy obiekt typu i inicjalizuje go znakami z ciągu znaków, rozpoczynając od znaku i wykorzystując następnych znaków (albo znaki do końca ciągu, jeżeli jest on kriótszy od ). Domyślnie wykorzystywany jest cały ciąg znaków. Znak o wartości powoduje wyzerowanie bitu a znak o wartości powoduje ustawienie bitu na jedynkę. Znaki o innej wartości powodują zgłoszenie wyjątku. Różne 109
Znak znajdujący się najbardziej po prawej stronie podciągu (czyli znak albo ostatni znak ciągu ) inicjalizuje najmniej znaczący bit pola, czyli bit o indeksie 0. Kolejne bity pola inicjowane są znakami z poprzednich indeksów ciągu. Bity niezainicjowane przez ciąg znaków są zerowane. Wszystkie pola bitowe z poniższych przykładów otrzymują wartość : Tak długa deklaracja szablonu wynika z zastosowania szablonu klasy. W typowych zastosowaniach wykorzystujących tylko klasę, można tą deklarację odczytywać następująco: Zwraca wartość, jeżeli którykolwiek bit jest ustawiony na wartość jeden a wartość zera, gdy wszystkie bity są izerami. Zwraca liczbę bitów o wartości jeden. Odwraca wartość wszystkich bitów. Zwraca wartość. Odwraca wartość bitu na pozycji. Jeżeli wartość jest nieprawidłowa, zgłaszany jest wyjątek. Zwraca wartość. Zwraca wartość, gdy wszystkie bity zerami, a wartość, jeżeli którykolwiek bit jest ustawiony na wartość ijeden. 110 STL. Leksykon kieszonkowy
Zwraca obiekt będący referencją na bit na pozycji. Jeżeli wartość jest z poza zakresu, zachowanie funkcji jest niezdefiniowane. Klasa przechowuje referencję na obiekt i pozycję. Przeciąża ona operator przypisania ( ) w ten sposób, że przypisania do obiektu typu zmieniają wartość pola bitowego. Klasa definiuje też metodę, odwracającą wartość bitu, którego dotyczy referencjia. Zwraca wartość bitu na pozycji. Jeżeli wartość jest spoza zakresu, zachowanie funkcji jest niezdefiniowanei. Zeruje wszystkie bity. Zwraca wartość. Zeruje bit na pozycji. Jeżeli wartość jest nieprawidłowa zgłaszany jest wyjątek. Zwraca wartość. Ustawia wszystkie bity. Zwraca wartość. Jeżeli wartość jest różna od zera, ustawia bit na pozycji. Jeżeli wartość jest nieprawidłowa, zgłaszany jest wyjątek. Zwraca wartość. Zwraca wartość. Zwraca wartość bitu na pozycji. Jeżeli wartość jest nieprawidłowa, zgłaszany jest wyjątek. Różne 111
Zwraca ciąg znaków reprezentujący zawartość obiektu. Każdy wyzerowany bit jest zamieniany na znak, a bity ustawione na jedynkę zamieniane są na znak. Bit z pozycji 0 jest zapisywany w ciągu na pierwszej pozycji od prawej strony (pozycji ). W czasie wywoływania funkcji kompilator nie jest w stanie wykryć parametrów szablonu, dlatego trzeba je podać jawnie: Przetwarza zawartość obiektu na wartość całkowitą. Jeżeli jest zbyt duże, żeby można było ją zapisać jako, zgłaszany jest wyjątek. Dla obiektów definiowane są również operatory bitowe, przesunięcia i równości stosujące zwyczajową semantykę. Operandy operatorów bitowych muszą być tej samej wielkości. Operatory przesunięć uzupełniają brakujące bity zerami. Przeciążane są też operatory wejścia-wyjścia. Operator wyjścia ( ) zapisuje zawartość obiektu do ciągu znaków w ten sam sposób jak robi to funkcja. Operator wejścia ( ) odczytuje z ciągu znaków zawartość obiektu, tak samo jak robi to konstruktor obiektu. 112 STL. Leksykon kieszonkowy
Pary Szablon klasy reprezentuje parę związanych ze sobą obiektów. Pary są najczęściej stosowane w szablonach klas i, które przechowują w nich klucze i związane z nimi obiekty. Szablon i związane z nim szablony funkcji są zadeklarowane pliku nagłówkowym. Deklaracji szablonu prawie nie trzeba objaśniać: Konstruktory obiektów nie są zbyt skomplikowane: Inicjalizuje element wartością a element wartością. Inicjalizuje element wartością a element wartością. Inicjalizuje element wartością a element wartością. Jeżeli to konieczne, są wykonywane odpowiednie konwersje. Różne 113
Niektóre szablony funkcji ułatwiają pracę z parami: Tworzy obiekt i inicjalizuje go wartościami i. Zastosowanie funkcji zamiast konstruktora szablonu pozwala kompilatorowi rozpoznać typy i wartości i. Zwraca wartość, gdy pary i są sobie równe, czyli gdy i. Zwraca wartość, gdy para jest mniejsza od pary, przy założeniu, że element jest bardziej znaczący niż element. To znaczy, że zwracany jest wynik wyrażenia. Pozostałe operatory porównań definiowane są na podstawie operatorów i. Sprytne wskaźniki Szablon klasy (zadeklarowanej w pliku nagłówkowym ) implementuje sprytne wskaźniki będące właścicielami wskaźników. Właściwe stosowanie klasy daje pewność, że dany wskaźnik posiada tylko jednego właściciela (co pozwala na uniknięcie podwójnych usunięć wskaźnika), który automatycznie zwalnia pamięć, gdy właściciel wyjdzie poza dopuszczalny zakres (dzięki czemu unika się wycieków pamięci). Przypisanie wartości typu zmienia właściciela wskaźnika z obiektu źródłowego na obiekt docelowy operacji przypisania. 114 STL. Leksykon kieszonkowy
Uwaga Szablon nie ma semantyki wartości, ponieważ przypisanie lub kopiowanie obiektu typu powoduje modyfikacje obiektu źródłowego (zrzeczenie się własności), dlatego obiekty typu nie mogą być przechowywane w kontenerach. Poniżej znajdują się opisy składowych szablonu : Synonim typu bazowego. Inicjalizuje obiekt, tak żeby był on właścicielem wskaźnika. Inicjalizuje obiekt wskaźnikiem zwróconym przez. W drugiej wersji konstruktora typ musi być pośrednio konwertowalny na. Należy zauważyć, że nie jest oznaczony jako. Nie jest możliwe kopiowanie obiektu typu, ponieważ doprowadziłoby to naruszenia zasad własności. Inicjalizuje obiekt wskaźnikiem uzyskanym z wywołania funkcji z obiektu. Usuwa wskaźnik posiadany przez obiekt np. przez wywołanie. Zwraca posiadany wskaźnik. Zwraca wynik działania funkcji a posiadany wskaźnik ustawia na 0. Różne 115
Usuwa posiadany wskaźnik (jeżeli nie jest on równy ) i zapisuje jako nowo posiadany wskaźnik. Zwraca tymczasowy obiekt typu posiadający wskaźnik. Wskaźnik musi być konwertowalny na typ. Własność jest przenoszona na nowy obiekt. Typ jest typem definiowanym w implementacji, ułatwiającym stosowanie obiektów jako typów zwracanych przez funkcję. W większości przypadków, można ignorować typ i deklarować parametry funkcji i wartości przez nie zwracane z wykorzystaniem typu, pozwalając kompilatorowi wykonać odpowiednie konwersje. Zwraca nowy obiekt typu. Posiadany wskaźnik jest konwertowany na typ a nowy obiekt przejmuje go na własność. Własność wskaźnika przenoszona jest na obiekt z obiektu albo z obiektu przechowywanego przez parametr. To znaczy, że wykonywane jest wywołanie. Zwraca wynik wywołania. Jeżeli przechowywany jest wskaźnik, zachowanie operatora jest niezdefiniowane. Zwraca wynik wywołania. W rozdziale Boost opisano inne sprytne wskaźniki, w tym również takie, które mogą wskazywać tablice i być przechowywane w kontenerach. 116 STL. Leksykon kieszonkowy