SlideShare a Scribd company logo
1 of 14
Download to read offline
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TRE CI   STL. Leksykon
                                         kieszonkowy
           KATALOG KSI¥¯EK
                                         Autor: Ray Lischner
                      KATALOG ONLINE     T³umaczenie: Wojciech Moch
                                         ISBN: 83-7361-438-9
       ZAMÓW DRUKOWANY KATALOG           Tytu³ orygina³u: STL Pocket Reference
                                         Format: B5, stron: 132

              TWÓJ KOSZYK
                    DODAJ DO KOSZYKA     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
         CENNIK I INFORMACJE             tych wszystkich szczegó³ów, nawet je li codziennie u¿ywasz biblioteki STL.
                                         Ksi¹¿ka Raya Lischnera „STL. Leksykon kieszonkowy” bêdzie dla Ciebie nieocenion¹
                   ZAMÓW INFORMACJE      pomoc¹ -- w prosty sposób odpowiada na wszystkie takie pytania.
                     O NOWO CIACH        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
                       ZAMÓW CENNIK      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
                 CZYTELNIA               programów.

          FRAGMENTY KSI¥¯EK ONLINE       „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............................................................................9
     Adaptory kontenerów .............................................................................11
     Wartości .....................................................................................................11
     Typowe składowe ....................................................................................12
     Wyjątki.......................................................................................................22
     Kolejki ........................................................................................................23
     Listy............................................................................................................24
     Mapy ..........................................................................................................28
     Kolejki priorytetowe ................................................................................29
     Kolejki ........................................................................................................31
     Zbiory.........................................................................................................32
     Stosy ...........................................................................................................34
     Ciągi znaków ............................................................................................35
     Wektory .....................................................................................................47

Iteratory...................................................................................49
     Kategorie iteratorów................................................................................50
     Stosowanie iteratorów.............................................................................51
     Cechy iteratorów ......................................................................................54
     Iteratory do stałej .....................................................................................55
     Iteratory wstawiające...............................................................................57
     Iteratory strumieni wejścia-wyjścia.........................................................58
     Iterator typu raw storage ........................................................................65
     Iteratory wsteczne....................................................................................65
     Szablony funkcji iteratorów....................................................................70

Algorytmy ...............................................................................70
     Operacje niemodyfikujące ......................................................................73
     Porównania ...............................................................................................73
     Wyszukiwanie ..........................................................................................76


Spis treści                                                                                                           3
Wyszukiwanie binarne............................................................................77
     Operacje modyfikujące sekwencje.........................................................79
     Operacje na niezainicjowanych sekwencjach ......................................85
     Sortowanie.................................................................................................86
     Łączenie .....................................................................................................88
     Operacje na zbiorach ...............................................................................89
     Operacje na stercie ...................................................................................91
     Permutacje.................................................................................................93
     Różne .........................................................................................................93
     Numeryczne..............................................................................................94

Funktory ..................................................................................95
     Stosowanie funktorów ............................................................................96
     Podstawy funktorów ...............................................................................98
     Adaptory ...................................................................................................99
     Funktory wiążące...................................................................................102
     Funktory arytmetyczne i logiczne .......................................................103
     Funktory porównujące ..........................................................................105

Różne......................................................................................106
     Alokatory.................................................................................................106
     Pola bitowe (bitset) ................................................................................109
     Pary ..........................................................................................................113
     Sprytne wskaźniki..................................................................................114

Boost ......................................................................................117
     Tablice ......................................................................................................118
     Dynamiczne pola bitowe ......................................................................118
     Funktory wiążące...................................................................................119
     Składanie funkcji ....................................................................................120
     Adaptory .................................................................................................122
     Zmiana pliku nagłówkowego Functional ..........................................122
     Funkcje lambda ......................................................................................123
     Sprytne wskaźniki..................................................................................124

Skorowidz .............................................................................125




4                                                                           STL. Leksykon kieszonkowy
Różne
W tym rozdziale opisane zostaną szablony klas CNNQECVQT, CWVQARVT
i DKVUGV, których nie można przyporządkować do innych kategorii.


Alokatory
Alokator jest rozwinięciem wyrażeń PGY i FGNGVG. 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 CNNQECVQT, 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 CNNQECVQT.
Poniżej opisane zostały typy składowe szablonu CNNQECVQT:
V[RGFGH EQPUV 6
EQPUVARQKPVGT
       Typ wskaźnika na stały element.
V[RGFGH EQPUV 6
EQPUVATGHGTGPEG
       Typ stałej l-wartości.




                                                                106



%#PFTGL2(56. .GMU[MQP MKGUQPMQY[TFQE    UV[
V[RGFGH RVTFKHHAV FKHHGTGPEGAV[RG
        Typ reprezentujący różnicę między dowolnymi dwoma
        wskaźnikami zwróconymi przez alokator po wywołaniu
        funkcji CNNQECVG
.
V[RGFGH 6
RQKPVGT
        Typ wskaźnika.
VGORNCVG ENCUU 7 UVTWEV TGDKPF
        Wiąże obiekt alokatora z innym typem wartości. Klasa TG
        DKPF posiada jedną deklarację V[RGFGH — QVJGT — będącą
        instancją szablonu CNNQECVQT z typem 7, podanym w para-
        metrze szablonu. Standardowe kontenery alokujące obiekty
        pomocnicze, takie jak węzły łączące, zamiast bezpośred-
        niego alokowania wartości wykorzystują szablon TGDKPF.
        Osoby, które nie muszą implementować standardowych
        kontenerów, najprawdopodobniej nie będą też musiały znać
        sposobu działania tego szablonu.
V[RGFGH 6 TGHGTGPEG
        Typ l-wartości.
V[RGFGH UKGAV UKGAV[RG
        Typ, który może reprezentować rozmiar największego żą-
        dania alokacji.
V[RGFGH 6 XCNWGAV[RG
        Typ alokowanych wartości.
Poniżej opisane zostały metody szablonu CNNQECVQT:
CNNQECVQT
 VJTQY

CNNQECVQT
EQPUV CNNQECVQT  VJTQY

VGORNCVGENCUU 7 CNNQECVQT
EQPUV CNNQECVQT7  VJTQY

        Tworzy nowy obiekt alokatora kopiując, jeżeli to możliwe,
        istniejący alokator.
RQKPVGT CFFTGUU
TGHGTGPEG Z EQPUV
EQPUVARQKPVGT CFFTGUU
EQPUVATGHGTGPEG Z EQPUV
      Zwraca adres elementu Z, czyli wartość Z.



Różne                                                         107
RQKPVGT CNNQECVG
UKGAV[RG P CNNQECVQTXQKF 
                 EQPUVARQKPVGT JKPV  
      W celu zaalokowania pamięci wystarczającej do przecho-
      wania P elementów typu 6, wywołuje globalny operator PGY.
      Argument JKPV musi mieć wartość 0 lub wartość wskaźnika
      uzyskanego z innego wywołania funkcji CNNQECVG, którego
      nie przekazano jeszcze do funkcji FGCNNQECVG. 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 DCFACNNQE.
XQKF EQPUVTWEV
RQKPVGT R EQPUV 6 XCN
      Za pomocą globalnego operatora PGY tworzy kopię warto-
      ści XCN i umieszcza ją pod adresem R.
XQKF FGCNNQECVG
RQKPVGT R UKGAV[RG P
      Zwalnia pamięć wskazywaną przez R poprzez wywołanie
      globalnego operatora FGNGVG. Argument P przechowuje licz-
      bę elementów typu 6 — ta sama wartość przekazana była
      do funkcji CNNQECVG.
XQKF FGUVTQ[
RQKPVGT R
      Wywołuje destruktor obiektu umieszczonego pod adresem
      R. Oznacza to, że wykonywane jest wywołanie TGKPVGT
      RTGVAECUV6
R `6
.
UKGAV[RG OCZAUKG
 EQPUV VJTQY

      Zwraca maksymalny rozmiar, który można przekazać funk-
      cji CNNQECVG.
Standard definiuje specjalizowany szablon CNNQECVQTXQKF , który
nie deklaruje funkcji CNNQECVG, EQPUVTWEV itd., ponieważ nie jest
możliwe utworzenie obiektu typu XQKF. Możliwe jest jednak sto-
sowanie jego składowych RQKPVGT, EQPUVARQKPVGT i TGDKPF.
Operatory równości ( i ) są przeciążane w ten sposób, że
wszystkie obiekty typu CNNQECVQT są sobie równe niezależnie od
typu alokowanych wartości.


108                                        STL. Leksykon kieszonkowy
Pola bitowe (bitset)
Obiekty typu DKVUGV są spakowanymi sekwencjami bitów o stałej
wielkości. Nie są to standardowe kontenery, nie udostępniają też
iteratorów.
Szablon klasy DKVUGV (zadeklarowany jest w pliku nagłówkowym
DKVUGV ) pobiera pojedynczy parametr 0 określający liczbę prze-
chowywanych bitów.
Pojedynczy bit może zostać ustawiony na wartość jedynki (funk-
cja UGV) lub zera (funkcja TGUGV). Możliwa jest też zmiana wartości
bitu z jedynki na zero i z zera na jedynkę, umożliwia to funkcja
HNKR. Poniżej zostały opisane metody szablonu DKVUGV:

DKVUGV

        Tworzy obiekt typu DKVUGV z wszystkimi bitami wyzerowanymi.
DKVUGV
WPUKIPGF NQPI XCNWG
        Tworzy obiekt typu DKVUGV inicjalizując pierwszych O bitów
        wartością XCNWG, gdzie O  %*#4A$+65
UKGQH
WPUKIPGF NQPI.
        Jeżeli 0 O, to wszystkie pozostałe bity są ustawiane na war-
        tość zero. Jeżeli 0  O, to nadmiarowe bity są ignorowane.
VGORNCVGV[RGPCOG %JCT6 V[RGPCOG 6TCKVU V[RGPCOG #NE
GZRNKEKV DKVUGV
EQPUV DCUKEAUVTKPI%JCT66TCKVU#NE U
          V[RGPCOG DCUKEAUVTKPI%JCT66TCKVU#NE UKGAV[RG R
          V[RGPCOG DCUKEAUVTKPI%JCT66TCKVU#NE UKGAV[RG P
      DCUKEAUVTKPI%JCT66TCKVU#NE PRQU
      Tworzy obiekt typu DKVUGV i inicjalizuje go znakami z ciągu
      znaków U, rozpoczynając od znaku R i wykorzystując następ-
      nych P znaków (albo znaki do końca ciągu, jeżeli jest on krót-
      szy od P). Domyślnie wykorzystywany jest cały ciąg znaków.
      Znak o wartości  powoduje wyzerowanie bitu a znak o wa-
      rtości  powoduje ustawienie bitu na jedynkę. Znaki o innej
      wartości powodują zgłoszenie wyjątku KPXCNKFACTIWOGPV.




Różne                                                             109
Znak znajdujący się najbardziej po prawej stronie podcią-
      gu (czyli znak U=R
P? albo ostatni znak ciągu U) 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 U. Bity niezainicjowane przez ciąg znaków
      są zerowane. Wszystkie pola bitowe z poniższych przy-
      kładów otrzymują wartość :
DKVUGV   C
UVTKPI
    
DKVUGV   D
UVTKPI
    
DKVUGV   E
UVTKPI
      
DKVUGV   F
UVTKPI
      
      Tak długa deklaracja szablonu wynika z zastosowania sza-
      blonu klasy DCUKEAUVTKPI. W typowych zastosowaniach wy-
      korzystujących tylko klasę UVTKPI, można tą deklarację od-
      czytywać następująco:
       DKVUGV
EQPUV UVTKPI U UKGAV R
              UKGAV PUVTKPIPRQU
DQQN CP[
 EQPUV
      Zwraca wartość VTWG, jeżeli którykolwiek bit jest ustawiony na
      wartość jeden a wartość zera, gdy wszystkie bity są zerami.
UKGAV EQWPV
 EQPUV
      Zwraca liczbę bitów o wartości jeden.
DKVUGV0    HNKR

      Odwraca wartość wszystkich bitów. Zwraca wartość
VJKU.
DKVUGV0    HNKR
UKGAV RQU
      Odwraca wartość bitu na pozycji RQU. Jeżeli wartość RQU jest
      nieprawidłowa, zgłaszany jest wyjątek QWVAQHATCPIG. Zwra-
      ca wartość

More Related Content

More from Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

STL. Leksykon kieszonkowy

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI STL. Leksykon kieszonkowy KATALOG KSI¥¯EK Autor: Ray Lischner KATALOG ONLINE T³umaczenie: Wojciech Moch ISBN: 83-7361-438-9 ZAMÓW DRUKOWANY KATALOG Tytu³ orygina³u: STL Pocket Reference Format: B5, stron: 132 TWÓJ KOSZYK DODAJ DO KOSZYKA 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 CENNIK I INFORMACJE tych wszystkich szczegó³ów, nawet je li codziennie u¿ywasz biblioteki STL. Ksi¹¿ka Raya Lischnera „STL. Leksykon kieszonkowy” bêdzie dla Ciebie nieocenion¹ ZAMÓW INFORMACJE pomoc¹ -- w prosty sposób odpowiada na wszystkie takie pytania. O NOWO CIACH 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 ZAMÓW CENNIK 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 CZYTELNIA programów. FRAGMENTY KSI¥¯EK ONLINE „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
  • 2. Spis treści Wprowadzenie..........................................................................5 Kontenery ..................................................................................8 Kontenery standardowe............................................................................9 Adaptory kontenerów .............................................................................11 Wartości .....................................................................................................11 Typowe składowe ....................................................................................12 Wyjątki.......................................................................................................22 Kolejki ........................................................................................................23 Listy............................................................................................................24 Mapy ..........................................................................................................28 Kolejki priorytetowe ................................................................................29 Kolejki ........................................................................................................31 Zbiory.........................................................................................................32 Stosy ...........................................................................................................34 Ciągi znaków ............................................................................................35 Wektory .....................................................................................................47 Iteratory...................................................................................49 Kategorie iteratorów................................................................................50 Stosowanie iteratorów.............................................................................51 Cechy iteratorów ......................................................................................54 Iteratory do stałej .....................................................................................55 Iteratory wstawiające...............................................................................57 Iteratory strumieni wejścia-wyjścia.........................................................58 Iterator typu raw storage ........................................................................65 Iteratory wsteczne....................................................................................65 Szablony funkcji iteratorów....................................................................70 Algorytmy ...............................................................................70 Operacje niemodyfikujące ......................................................................73 Porównania ...............................................................................................73 Wyszukiwanie ..........................................................................................76 Spis treści 3
  • 3. Wyszukiwanie binarne............................................................................77 Operacje modyfikujące sekwencje.........................................................79 Operacje na niezainicjowanych sekwencjach ......................................85 Sortowanie.................................................................................................86 Łączenie .....................................................................................................88 Operacje na zbiorach ...............................................................................89 Operacje na stercie ...................................................................................91 Permutacje.................................................................................................93 Różne .........................................................................................................93 Numeryczne..............................................................................................94 Funktory ..................................................................................95 Stosowanie funktorów ............................................................................96 Podstawy funktorów ...............................................................................98 Adaptory ...................................................................................................99 Funktory wiążące...................................................................................102 Funktory arytmetyczne i logiczne .......................................................103 Funktory porównujące ..........................................................................105 Różne......................................................................................106 Alokatory.................................................................................................106 Pola bitowe (bitset) ................................................................................109 Pary ..........................................................................................................113 Sprytne wskaźniki..................................................................................114 Boost ......................................................................................117 Tablice ......................................................................................................118 Dynamiczne pola bitowe ......................................................................118 Funktory wiążące...................................................................................119 Składanie funkcji ....................................................................................120 Adaptory .................................................................................................122 Zmiana pliku nagłówkowego Functional ..........................................122 Funkcje lambda ......................................................................................123 Sprytne wskaźniki..................................................................................124 Skorowidz .............................................................................125 4 STL. Leksykon kieszonkowy
  • 4. Różne W tym rozdziale opisane zostaną szablony klas CNNQECVQT, CWVQARVT i DKVUGV, których nie można przyporządkować do innych kategorii. Alokatory Alokator jest rozwinięciem wyrażeń PGY i FGNGVG. 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 CNNQECVQT, 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 CNNQECVQT. Poniżej opisane zostały typy składowe szablonu CNNQECVQT: V[RGFGH EQPUV 6
  • 5. EQPUVARQKPVGT Typ wskaźnika na stały element. V[RGFGH EQPUV 6
  • 6. EQPUVATGHGTGPEG Typ stałej l-wartości. 106 %#PFTGL2(56. .GMU[MQP MKGUQPMQY[TFQE UV[
  • 7. V[RGFGH RVTFKHHAV FKHHGTGPEGAV[RG Typ reprezentujący różnicę między dowolnymi dwoma wskaźnikami zwróconymi przez alokator po wywołaniu funkcji CNNQECVG . V[RGFGH 6
  • 8. RQKPVGT Typ wskaźnika. VGORNCVG ENCUU 7 UVTWEV TGDKPF Wiąże obiekt alokatora z innym typem wartości. Klasa TG DKPF posiada jedną deklarację V[RGFGH — QVJGT — będącą instancją szablonu CNNQECVQT z typem 7, podanym w para- metrze szablonu. Standardowe kontenery alokujące obiekty pomocnicze, takie jak węzły łączące, zamiast bezpośred- niego alokowania wartości wykorzystują szablon TGDKPF. Osoby, które nie muszą implementować standardowych kontenerów, najprawdopodobniej nie będą też musiały znać sposobu działania tego szablonu. V[RGFGH 6 TGHGTGPEG Typ l-wartości. V[RGFGH UKGAV UKGAV[RG Typ, który może reprezentować rozmiar największego żą- dania alokacji. V[RGFGH 6 XCNWGAV[RG Typ alokowanych wartości. Poniżej opisane zostały metody szablonu CNNQECVQT: CNNQECVQT VJTQY CNNQECVQT EQPUV CNNQECVQT VJTQY VGORNCVGENCUU 7 CNNQECVQT EQPUV CNNQECVQT7 VJTQY Tworzy nowy obiekt alokatora kopiując, jeżeli to możliwe, istniejący alokator. RQKPVGT CFFTGUU TGHGTGPEG Z EQPUV EQPUVARQKPVGT CFFTGUU EQPUVATGHGTGPEG Z EQPUV Zwraca adres elementu Z, czyli wartość Z. Różne 107
  • 9. RQKPVGT CNNQECVG UKGAV[RG P CNNQECVQTXQKF EQPUVARQKPVGT JKPV W celu zaalokowania pamięci wystarczającej do przecho- wania P elementów typu 6, wywołuje globalny operator PGY. Argument JKPV musi mieć wartość 0 lub wartość wskaźnika uzyskanego z innego wywołania funkcji CNNQECVG, którego nie przekazano jeszcze do funkcji FGCNNQECVG. 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 DCFACNNQE. XQKF EQPUVTWEV RQKPVGT R EQPUV 6 XCN Za pomocą globalnego operatora PGY tworzy kopię warto- ści XCN i umieszcza ją pod adresem R. XQKF FGCNNQECVG RQKPVGT R UKGAV[RG P Zwalnia pamięć wskazywaną przez R poprzez wywołanie globalnego operatora FGNGVG. Argument P przechowuje licz- bę elementów typu 6 — ta sama wartość przekazana była do funkcji CNNQECVG. XQKF FGUVTQ[ RQKPVGT R Wywołuje destruktor obiektu umieszczonego pod adresem R. Oznacza to, że wykonywane jest wywołanie TGKPVGT RTGVAECUV6
  • 10. R `6 . UKGAV[RG OCZAUKG EQPUV VJTQY Zwraca maksymalny rozmiar, który można przekazać funk- cji CNNQECVG. Standard definiuje specjalizowany szablon CNNQECVQTXQKF , który nie deklaruje funkcji CNNQECVG, EQPUVTWEV itd., ponieważ nie jest możliwe utworzenie obiektu typu XQKF. Możliwe jest jednak sto- sowanie jego składowych RQKPVGT, EQPUVARQKPVGT i TGDKPF. Operatory równości ( i ) są przeciążane w ten sposób, że wszystkie obiekty typu CNNQECVQT są sobie równe niezależnie od typu alokowanych wartości. 108 STL. Leksykon kieszonkowy
  • 11. Pola bitowe (bitset) Obiekty typu DKVUGV są spakowanymi sekwencjami bitów o stałej wielkości. Nie są to standardowe kontenery, nie udostępniają też iteratorów. Szablon klasy DKVUGV (zadeklarowany jest w pliku nagłówkowym DKVUGV ) pobiera pojedynczy parametr 0 określający liczbę prze- chowywanych bitów. Pojedynczy bit może zostać ustawiony na wartość jedynki (funk- cja UGV) lub zera (funkcja TGUGV). Możliwa jest też zmiana wartości bitu z jedynki na zero i z zera na jedynkę, umożliwia to funkcja HNKR. Poniżej zostały opisane metody szablonu DKVUGV: DKVUGV Tworzy obiekt typu DKVUGV z wszystkimi bitami wyzerowanymi. DKVUGV WPUKIPGF NQPI XCNWG Tworzy obiekt typu DKVUGV inicjalizując pierwszych O bitów wartością XCNWG, gdzie O %*#4A$+65
  • 12. UKGQH WPUKIPGF NQPI. Jeżeli 0 O, to wszystkie pozostałe bity są ustawiane na war- tość zero. Jeżeli 0 O, to nadmiarowe bity są ignorowane. VGORNCVGV[RGPCOG %JCT6 V[RGPCOG 6TCKVU V[RGPCOG #NE GZRNKEKV DKVUGV EQPUV DCUKEAUVTKPI%JCT66TCKVU#NE U V[RGPCOG DCUKEAUVTKPI%JCT66TCKVU#NE UKGAV[RG R V[RGPCOG DCUKEAUVTKPI%JCT66TCKVU#NE UKGAV[RG P DCUKEAUVTKPI%JCT66TCKVU#NE PRQU Tworzy obiekt typu DKVUGV i inicjalizuje go znakami z ciągu znaków U, rozpoczynając od znaku R i wykorzystując następ- nych P znaków (albo znaki do końca ciągu, jeżeli jest on krót- szy od P). Domyślnie wykorzystywany jest cały ciąg znaków. Znak o wartości powoduje wyzerowanie bitu a znak o wa- rtości powoduje ustawienie bitu na jedynkę. Znaki o innej wartości powodują zgłoszenie wyjątku KPXCNKFACTIWOGPV. Różne 109
  • 13. Znak znajdujący się najbardziej po prawej stronie podcią- gu (czyli znak U=R P? albo ostatni znak ciągu U) 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 U. Bity niezainicjowane przez ciąg znaków są zerowane. Wszystkie pola bitowe z poniższych przy- kładów otrzymują wartość : DKVUGV C UVTKPI DKVUGV D UVTKPI DKVUGV E UVTKPI DKVUGV F UVTKPI Tak długa deklaracja szablonu wynika z zastosowania sza- blonu klasy DCUKEAUVTKPI. W typowych zastosowaniach wy- korzystujących tylko klasę UVTKPI, można tą deklarację od- czytywać następująco: DKVUGV EQPUV UVTKPI U UKGAV R UKGAV PUVTKPIPRQU DQQN CP[ EQPUV Zwraca wartość VTWG, jeżeli którykolwiek bit jest ustawiony na wartość jeden a wartość zera, gdy wszystkie bity są zerami. UKGAV EQWPV EQPUV Zwraca liczbę bitów o wartości jeden. DKVUGV0 HNKR Odwraca wartość wszystkich bitów. Zwraca wartość
  • 14. VJKU. DKVUGV0 HNKR UKGAV RQU Odwraca wartość bitu na pozycji RQU. Jeżeli wartość RQU jest nieprawidłowa, zgłaszany jest wyjątek QWVAQHATCPIG. Zwra- ca wartość
  • 15. VJKU. DQQN PQPG EQPUV Zwraca wartość VTWG, gdy wszystkie bity zerami, a wartość HCNUG, jeżeli którykolwiek bit jest ustawiony na wartość jeden. 110 STL. Leksykon kieszonkowy
  • 16. TGHGTGPEG QRGTCVQT=? UKGAV RQU Zwraca obiekt DKVUGVTGHGTGPEG będący referencją na bit na pozycji RQU. Jeżeli wartość RQU jest z poza zakresu, za- chowanie funkcji jest niezdefiniowane. Klasa DKVUGVTGHG TGPEG przechowuje referencję na obiekt DKVUGV i pozycję RQU. Przeciąża ona operator przypisania () w ten sposób, że przypisania do obiektu typu TGHGTGPEG zmieniają wartość pola bitowego DKVUGV. Klasa TGHGTGPEG definiuje też metodę HNKR, odwracającą wartość bitu, którego dotyczy referencja. DQQN QRGTCVQT=? UKGAV RQU EQPUV Zwraca wartość bitu na pozycji RQU. Jeżeli wartość RQU jest spoza zakresu, zachowanie funkcji jest niezdefiniowane. DKVUGV0 TGUGV Zeruje wszystkie bity. Zwraca wartość
  • 17. VJKU. DKVUGV0 TGUGV UKGAV RQU Zeruje bit na pozycji RQU. Jeżeli wartość RQU jest nieprawi- dłowa zgłaszany jest wyjątek QWVAQHATCPIG. Zwraca war- tość
  • 18. VJKU. DKVUGV0 UGV Ustawia wszystkie bity. Zwraca wartość
  • 19. VJKU. DKVUGV0 UGV UKGAV RQU KPV XCN VTWG Jeżeli wartość XCN jest różna od zera, ustawia bit na pozycji RQU. Jeżeli wartość RQU jest nieprawidłowa, zgłaszany jest wyjątek QWVAQHATCPIG. Zwraca wartość
  • 20. VJKU. UKGAV UKG EQPUV Zwraca wartość 0. DQQN VGUV UKGAV RQU EQPUV Zwraca wartość bitu na pozycji RQU. Jeżeli wartość RQU jest nieprawidłowa, zgłaszany jest wyjątek QWVAQHATCPIG. Różne 111
  • 21. VGORNCVG ENCUU EJCT6 ENCUU VTCKVU ENCUU #NNQECVQT DCUKEAUVTKPIEJCT6 VTCKVU #NNQECQVT VQAUVTKPI EQPUV Zwraca ciąg znaków reprezentujący zawartość obiektu DKV UGV. 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 0). W czasie wywoływania funkcji VQAUVTKPI kompilator nie jest w stanie wykryć parametrów szablonu, dlatego trzeba je podać jawnie: UVFDKVUGV DKVU UVFUVTKPI UVFUVTKPI UVT DKVUVGORNCVG VQAUVTKPIEJCT UVFEJCTAVTCKVUEJCT UVFCNNQECVQTEJCT WPUKIPGF NQPI VQAWNQPI EQPUV Przetwarza zawartość obiektu DKVUGV na wartość całkowitą. Jeżeli 0 jest zbyt duże, żeby można było ją zapisać jako WP UKIPGF NQPI, zgłaszany jest wyjątek QXGTHNQYAGTTQT. Dla obiektów DKVUGV 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 DKVUGV do ciągu znaków w ten sam sposób jak robi to funkcja VQAUVTKPI. Operator wejścia ( ) odczytuje z ciągu znaków zawartość obiektu DKVUGV, tak samo jak robi to konstruktor obiektu. 112 STL. Leksykon kieszonkowy
  • 22. Pary Szablon klasy RCKT reprezentuje parę związanych ze sobą obiek- tów. Pary są najczęściej stosowane w szablonach klas OCR i OWNVK OCR, które przechowują w nich klucze i związane z nimi obiekty. Szablon RCKT i związane z nim szablony funkcji są zadeklarowane pliku nagłówkowym WVKNKV[ . Deklaracji szablonu RCKT prawie nie trzeba objaśniać: VGORNCVG V[RGPCOG 6 V[RGPCOG 6 UVTWEV RCKT ] V[RGFGH 6 HKTUVAV[RG V[RGFGH 6 UGEQPFAV[RG 6 HKTUV 6 UGEQPF RCKT RCKT EQPUV 6 Z EQPUV 6 [ VGORNCVGV[RGPCOG 7 V[RGPCOG 8 RCKT EQPUV RCKT7 8 R _ Konstruktory obiektów RCKT6 6 nie są zbyt skomplikowane: RCKT Inicjalizuje element HKTUV wartością 6 a element UGEQPF wartością 6 . RCKT EQPUV 6 Z EQPUV 6 [ Inicjalizuje element HKTUV wartością Z a element UGEQPF wartością [. VGORNCVGV[RGPCOG 7 V[RGPCOG 8 RCKT EQPUV RCKT7 8 R Inicjalizuje element HKTUV wartością RHKTUV a element UGEQPF wartością RUGEQPF. Jeżeli to konieczne, są wykonywane odpowiednie konwersje. Różne 113
  • 23. Niektóre szablony funkcji ułatwiają pracę z parami: VGORNCVGV[RGPCOG 6 V[RGPCOG 6 RCKT66 OCMGARCKT 6 C 6 D Tworzy obiekt RCKT6 6 i inicjalizuje go wartościami C i D. Zastosowanie funkcji OCMGARCKT zamiast konstruktora szablonu RCKT pozwala kompilatorowi rozpoznać typy 6 i 6 wartości C i D. VGORNCVGV[RGPCOG 6 V[RGPCOG 6 DQQN QRGTCVQT EQPUV RCKT66 C EQPUV RCKT66 D Zwraca wartość VTWG, gdy pary C i D są sobie równe, czyli gdy CHKTUV DHKTUV i CUGEQPF DUGEQPF. VGORNCVGV[RGPCOG 6 V[RGPCOG 6 DQQN QRGTCVQT EQPUV RCKT66 C EQPUV RCKT66 D Zwraca wartość VTWG, gdy para C jest mniejsza od pary D, przy założeniu, że element HKTUV jest bardziej znaczący niż element UGEQPF. To znaczy, że zwracany jest wynik wyraże- nia CHKTUV DHKTUV ^^ DHKTUV CHKTUV CUGEQPF DUGEQPF. Pozostałe operatory porównań definiowane są na podstawie ope- ratorów i . Sprytne wskaźniki Szablon klasy CWVQARVT (zadeklarowanej w pliku nagłówkowym OGOQT[ ) implementuje sprytne wskaźniki będące właścicielami wskaźników. Właściwe stosowanie klasy CWVQARVT daje pewność, że dany wskaźnik posiada tylko jednego właściciela (co pozwala na 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 CWVQARVT zmienia właściciela wskaźnika z obiektu źródłowego na obiekt docelowy operacji przypisania. 114 STL. Leksykon kieszonkowy
  • 24. Uwaga Szablon CWVQARVT nie ma semantyki wartości, ponieważ przypisanie lub kopiowanie obiektu typu CWVQARVT powoduje modyfikacje obiektu źródłowego (zrzeczenie się własności), dlatego obiekty typu CWVQARVT nie mogą być przechowywa- ne w kontenerach. Poniżej znajdują się opisy składowych szablonu CWVQARVT: V[RGFGH 6 GNGOGPVAV[RG Synonim typu bazowego. GZRNKEKV CWVQARVT 6
  • 25. R VJTQY Inicjalizuje obiekt CWVQARVT, tak żeby był on właścicielem wskaźnika R. CWVQARVT CWVQARVT Z VJTQY VGORNCVGENCUU 7 CWVQARVT CWVQARVT7 Z VJTQY Inicjalizuje obiekt CWVQARVT wskaźnikiem zwróconym przez ZTGNGCUG . W drugiej wersji konstruktora typ 7
  • 26. musi być pośrednio konwertowalny na 6
  • 27. . Należy zauważyć, że Z nie jest oznaczony jako EQPUV. Nie jest możliwe kopiowa- nie obiektu typu EQPUV CWVQARVT, ponieważ doprowadziło- by to naruszenia zasad własności. CWVQARVT CWVQARVTATGH6 T VJTQY Inicjalizuje obiekt CWVQARVT wskaźnikiem uzyskanym z wy- wołania funkcji TGNGCUG z obiektu T. `CWVQARVT VJTQY Usuwa wskaźnik posiadany przez obiekt np. przez wy- wołanie FGNGVG IGV . 6
  • 28. IGV EQPUV VJTQY Zwraca posiadany wskaźnik. 6
  • 29. TGNGCUG VJTQY Zwraca wynik działania funkcji IGV a posiadany wskaź- nik ustawia na 0. Różne 115
  • 31. R VJTQY Usuwa posiadany wskaźnik (jeżeli nie jest on równy R) i za- pisuje R jako nowo posiadany wskaźnik. VGORNCVGENCUU 7 QRGTCVQT CWVQARVTATGH7 VJTQY Zwraca tymczasowy obiekt typu CWVQARVTATGH posiadający wskaźnik. Wskaźnik musi być konwertowalny na typ 7
  • 32. . Własność jest przenoszona na nowy obiekt CWVQARVTATGH. Typ CWVQARVTATGH jest typem definiowanym w implementacji, ułatwiającym stosowanie obiektów CWVQARVT jako typów zwra- canych przez funkcję. W większości przypadków, można igno- rować typ CWVQARVTATGH i deklarować parametry funkcji i warto- ści przez nie zwracane z wykorzystaniem typu CWVQA RVT, pozwalając kompilatorowi wykonać odpowiednie konwersje. VGORNCVGENCUU 7 QRGTCVQT CWVQARVT7 VJTQY Zwraca nowy obiekt typu CWVQARVT. Posiadany wskaźnik jest konwertowany na typ 7
  • 33. a nowy obiekt CWVQARVT przejmuje go na własność. CWVQARVT QRGTCVQT CWVQARVT Z VJTQY VGORNCVGENCUU 7 CWVQARVT QRGTCVQT CWVQARVT7 Z VJTQY CWVQARVT QRGTCVQT CWVQARVTATGH6 T VJTQY Własność wskaźnika przenoszona jest na obiekt
  • 34. VJKU z obie- ktu Z albo z obiektu CWVQARVT przechowywanego przez para- metr T. To znaczy, że wykonywane jest wywołanie TGUGV Z TGNGCUG . 6 QRGTCVQT
  • 35. EQPUV VJTQY Zwraca wynik wywołania
  • 36. IGV . Jeżeli przechowywany jest wskaźnik PWNN, zachowanie operatora jest niezdefiniowane. 6
  • 37. QRGTCVQT EQPUV VJTQY Zwraca wynik wywołania IGV . 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