STL. Leksykon kieszonkowy
-
Upload
wydawnictwo-helion -
Category
Documents
-
view
892 -
download
0
description
Transcript of STL. Leksykon kieszonkowy
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: [email protected]
PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£
IDZ DOIDZ DO
ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG
KATALOG KSI¥¯EKKATALOG KSI¥¯EK
TWÓJ KOSZYKTWÓJ KOSZYK
CENNIK I INFORMACJECENNIK I INFORMACJE
ZAMÓW INFORMACJEO NOWO�CIACH
ZAMÓW INFORMACJEO NOWO�CIACH
ZAMÓW CENNIKZAMÓW CENNIK
CZYTELNIACZYTELNIA
FRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE
SPIS TRE�CISPIS TRE�CI
DODAJ DO KOSZYKADODAJ DO KOSZYKA
KATALOG ONLINEKATALOG ONLINE
STL. Leksykonkieszonkowy
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.
Autor: Ray Lischner
T³umaczenie: Wojciech Moch
ISBN: 83-7361-438-9
Tytu³ orygina³u: STL Pocket Reference
Format: B5, stron: 132
Spis treści 3
Spis treści
Wprowadzenie..........................................................................5
Kontenery ..................................................................................8Kontenery standardowe............................................................................9Adaptory kontenerów.............................................................................11Wartości .....................................................................................................11Typowe składowe ....................................................................................12Wyjątki.......................................................................................................22Kolejki ........................................................................................................23Listy............................................................................................................24Mapy ..........................................................................................................28Kolejki priorytetowe................................................................................29Kolejki ........................................................................................................31Zbiory.........................................................................................................32Stosy ...........................................................................................................34Ciągi znaków............................................................................................35Wektory .....................................................................................................47
Iteratory...................................................................................49Kategorie iteratorów................................................................................50Stosowanie iteratorów.............................................................................51Cechy iteratorów......................................................................................54Iteratory do stałej .....................................................................................55Iteratory wstawiające...............................................................................57Iteratory strumieni wejścia-wyjścia.........................................................58Iterator typu raw storage ........................................................................65Iteratory wsteczne....................................................................................65Szablony funkcji iteratorów....................................................................70
Algorytmy ...............................................................................70Operacje niemodyfikujące ......................................................................73Porównania ...............................................................................................73Wyszukiwanie ..........................................................................................76
4 STL. Leksykon kieszonkowy
Wyszukiwanie binarne............................................................................77Operacje modyfikujące sekwencje.........................................................79Operacje na niezainicjowanych sekwencjach ......................................85Sortowanie.................................................................................................86Łączenie .....................................................................................................88Operacje na zbiorach ...............................................................................89Operacje na stercie ...................................................................................91Permutacje.................................................................................................93Różne .........................................................................................................93Numeryczne..............................................................................................94
Funktory ..................................................................................95Stosowanie funktorów ............................................................................96Podstawy funktorów ...............................................................................98Adaptory ...................................................................................................99Funktory wiążące...................................................................................102Funktory arytmetyczne i logiczne .......................................................103Funktory porównujące ..........................................................................105
Różne......................................................................................106Alokatory.................................................................................................106Pola bitowe (bitset) ................................................................................109Pary ..........................................................................................................113Sprytne wskaźniki..................................................................................114
Boost ......................................................................................117Tablice......................................................................................................118Dynamiczne pola bitowe ......................................................................118Funktory wiążące...................................................................................119Składanie funkcji ....................................................................................120Adaptory .................................................................................................122Zmiana pliku nagłówkowego Functional ..........................................122Funkcje lambda ......................................................................................123Sprytne wskaźniki..................................................................................124
Skorowidz .............................................................................125
106
����������� ��������������������������������� �������� ���
Różne
W tym rozdziale opisane zostaną szablony klas ���������, �������
i ��� �, których nie można przyporządkować do innych kategorii.
Alokatory
Alokator jest rozwinięciem wyrażeń � � i � � � . Standardowe
kontenery stosują alokatory do alokowania i zwalniania pa-
mięci a także do konstruowania i niszczenia obiektów zapisa-
nych w kontenerze.
Biblioteka standardowa definiuje szablon klasy ���������, który
jest domyślnym alokatorem wszystkich standardowych kontene-
rów. Możliwe jest zastosowanie innego alokatora pod warunkie-m, ż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 stan-
dardowego szablonu klasy ���������.
Poniżej opisane zostały typy składowe szablonu ���������:
�� � ����������������������
Typ wskaźnika na stały element.
�� � ��������������������
Typ stałej l-wartości.
Różne 107
�� � ������������������� �
Typ reprezentujący różnicę między dowolnymi dwomawskaźnikami zwróconymi przez alokator po wywołaniufunkcji ������� ��.
�� � ����������
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 para-metrze szablonu. Standardowe kontenery alokujące obiektypomocnicze, takie jak węzły łączące, zamiast bezpośred-niego alokowania wartości wykorzystują szablon � ���.Osoby, które nie muszą implementować standardowychkonteneró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ść � .
108 STL. Leksykon kieszonkowy
���� ������������� ��� ��!�����������"����##��������������������������� �������$�%�
W celu zaalokowania pamięci wystarczającej do przecho-
wania � 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 licz-
bę 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ć funk-
cji ������� .
Standard definiuje specjalizowany szablon ����������"����, którynie deklaruje funkcji ������� , ��������� itd., ponieważ nie jest
możliwe utworzenie obiektu typu "���. Możliwe jest jednak sto-
sowanie jego składowych ���� �, ���������� � i � ���.
Operatory równości ($$ i'$) są przeciążane w ten sposób, żewszystkie obiekty typu ��������� są sobie równe niezależnie od
typu alokowanych wartości.
Różne 109
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ę prze-
chowywanych bitów.
Pojedynczy bit może zostać ustawiony na wartość jedynki (funk-
cja � �) 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 ��$$�*+,-�./�0������ �������)� �����)�.
Jeżeli (����, to wszystkie pozostałe bity są ustawiane na war-
tość 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ęp-
nych � znaków (albo znaki do końca ciągu, jeżeli jest on krót-
szy od �). Domyślnie wykorzystywany jest cały ciąg znaków.
Znak o wartości 1%1 powoduje wyzerowanie bitu a znak o wa-rtości 121 powoduje ustawienie bitu na jedynkę. Znaki o innej
wartości powodują zgłoszenie wyjątku ��"�������)�� ��.
110 STL. Leksykon kieszonkowy
Znak znajdujący się najbardziej po prawej stronie podcią-
gu (czyli znak �34��25 albo ostatni znak ciągu �) inicjali-
zuje najmniej znaczący bit pola, czyli bit o indeksie 0. Ko-
lejne 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 przy-
kładów otrzymują wartość %%%222:
��� ��6���������)�72227��8��� ��6��������)�7%%%2227��8��� ��6���������)�72%22%%222%%7�!�9!�:�8��� ��6���������)�72222227�!�;!�:<�8
Tak długa deklaracja szablonu wynika z zastosowania sza-
blonu klasy ����������). W typowych zastosowaniach wy-
korzystujących tylko klasę �����), można tą deklarację od-
czytywać następująco:
��� �������������)���!���� ���$%!���������� ����$�����)##����
������ ��������
Zwraca wartość ��� , jeżeli którykolwiek bit jest ustawiony na
wartość jeden a wartość zera, gdy wszystkie bity są zerami.
��� ����������������
Zwraca liczbę bitów o wartości jeden.
��� ��(���������
Odwraca wartość wszystkich bitów. Zwraca wartość �����.
��� ��(����������� ������
Odwraca wartość bitu na pozycji ��. Jeżeli wartość �� jestnieprawidłowa, zgłaszany jest wyjątek ����������) . Zwra-
ca wartość �����.���������������
Zwraca wartość ��� , gdy wszystkie bity zerami, a wartość
���� , jeżeli którykolwiek bit jest ustawiony na wartość jeden.
Różne 111
� � � �� ������������ ������
Zwraca obiekt ��� �##� � � �� będący referencją na bit
na pozycji ��. Jeżeli wartość �� jest z poza zakresu, za-
chowanie 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 referencja.
��������������� ������������
Zwraca wartość bitu na pozycji ��. Jeżeli wartość �� jest
spoza zakresu, zachowanie funkcji jest niezdefiniowane.
��� ��(�������
Zeruje wszystkie bity. Zwraca wartość �����.
��� ��(��������� ������
Zeruje bit na pozycji ��. Jeżeli wartość �� jest nieprawi-
dłowa zgłaszany jest wyjątek ����������) . Zwraca war-
tość �����.
��� ��(�������
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ść �� jestnieprawidłowa, zgłaszany jest wyjątek ����������) .
112 STL. Leksykon kieszonkowy
� ���� �������������!�������������!�������,�������������������)������!�������!�,��������������������������
Zwraca ciąg znaków reprezentujący zawartość obiektu ���� �. Każdy wyzerowany bit jest zamieniany na znak 1%1,
a bity ustawione na jedynkę zamieniane są na znak 121. Bit
z pozycji 0 jest zapisywany w ciągu na pierwszej pozycji
od prawej strony (pozycji (�2).
W czasie wywoływania funkcji ��������) kompilator nie
jest w stanie wykryć parametrów szablonu, dlatego trzeba
je podać jawnie:
���##��� ��6:���������##�����)�72%2%%%2222%2%2%2%27��8���##�����)�����$����=� ���� ���������)�����!
���##�����������������!
���##��������������������8
����)� �����)�����������������
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 bi-
towe, przesunięcia i równości stosujące zwyczajową sema-
ntykę. Operandy operatorów bitowych muszą być tej sa-mej 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.
Różne 113
Pary
Szablon klasy ��� reprezentuje parę związanych ze sobą obiek-tó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ą zadeklarowanepliku nagłówkowym ���������.
Deklaracji szablonu ��� prawie nie trzeba objaśniać:
� ���� ���� ��� ��2!��� ��� ��<������������>���� � ���2������� �8���� � ���<�������� �8���2�����8���<������8�������8�������������2�� !��������<����8��� ���� ��� ��� ��!��� ��� �?��������������������!�?����8@8
Konstruktory obiektów �����2!��<� nie są zbyt skomplikowane:
�����
Inicjalizuje element ����� wartością �2�� a element � ����
wartością �<��.
�����������2�� !��������<����
Inicjalizuje element ����� wartością a element � ����
wartością �.
� ���� ��� ��� ��!��� ��� �?����������������!�?����8
Inicjalizuje element ����� wartością =����� a element � ����wartością =� ����. Jeżeli to konieczne, są wykonywane
odpowiednie konwersje.
114 STL. Leksykon kieszonkowy
Niektóre szablony funkcji ułatwiają pracę z parami:
� ���� ��� ��� ��2!��� ��� ��<������2!�<�����������2��!��<��
Tworzy obiekt �����2!� �<� i inicjalizuje go wartościami
� i . Zastosowanie funkcji ��A ���� zamiast konstruktora
szablonu ����� pozwala kompilatorowi rozpoznać typy �2
i �< wartości � i .
� ���� ��� ��� ��2!��� ��� ��<������������������������2!�<����!������������2!�<����
Zwraca wartość ��� , gdy pary � i są sobie równe, czyli
gdy �=������$$�=����� i �=� �����$$�=� ����.
� ���� ��� ��� ��2!��� ��� ��<�����������������������2!�<����!������������2!�<����
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że-
nia �=��������=������BB��'�=���������=�����������=� ����
��=� �����.
Pozostałe operatory porównań definiowane są na podstawie ope-
ratoró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 pozwalana uniknięcie podwójnych usunięć wskaźnika), który automa-
tycznie zwalnia pamięć, gdy właściciel wyjdzie poza dopuszczal-
ny zakres (dzięki czemu unika się wycieków pamięci). Przypisa-
nie wartości typu ������� zmienia właściciela wskaźnika z obiektu
źródłowego na obiekt docelowy operacji przypisania.
Różne 115
Uwaga
Szablon ������� nie ma semantyki wartości, ponieważprzypisanie lub kopiowanie obiektu typu ������� powodujemodyfikacje obiektu źródłowego (zrzeczenie się własności),dlatego obiekty typu ������� nie mogą być przechowywa-ne w kontenerach.
Poniżej znajdują się opisy składowych szablonu �������:
�� � ���������� �
Synonim typu bazowego.
������������������$�%���������
Inicjalizuje obiekt �������, tak żeby był on właścicielemwskaźnika .
����������������� ���������� ���� ������������������������������ ���������
Inicjalizuje obiekt ������� wskaźnikiem zwróconym przez =� � �� ��. W drugiej wersji konstruktora typ �� musibyć pośrednio konwertowalny na ��. Należy zauważyć, że nie jest oznaczony jako �����. Nie jest możliwe kopiowa-nie obiektu typu �������������, ponieważ doprowadziło-by to naruszenia zasad własności.
����������������� ���������������
Inicjalizuje obiekt ������� wskaźnikiem uzyskanym z wy-wołania funkcji � � �� z obiektu �.
������������������
Usuwa wskaźnik posiadany przez obiekt np. przez wy-wołanie � � � �) ���.
���������������������
Zwraca posiadany wskaźnik.
����������������
Zwraca wynik działania funkcji ) ��� a posiadany wskaź-nik ustawia na 0.
116 STL. Leksykon kieszonkowy
"�����������$�%���������
Usuwa posiadany wskaźnik (jeżeli nie jest on równy ) i za-pisuje jako nowo posiadany wskaźnik.
� ���� ��������������������������������������
Zwraca tymczasowy obiekt typu ��������� � posiadającywskaź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 zwra-canych przez funkcję. W większości przypadków, można igno-rować 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 jestkonwertowany na typ �� a nowy obiekt ������� przejmuje gona własność.
������������������������� ���������� ���� ������������������������������������� ���������������������������������� ���������������
Własność wskaźnika przenoszona jest na obiekt ����� z obie-ktu albo z obiektu ������� przechowywanego przez para-metr �. To znaczy, że wykonywane jest wywołanie � � �� =� � �� ���.
�������� ����������������
Zwraca wynik wywołania �) ���. Jeżeli przechowywany jestwskaź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ć przechowywanew kontenerach.