Wprowadzenie do C++
Efektywne nauczanie
C++
wyjątkowo dobrze nadaje się do nauki jako "pierwszy poważny język
programowania", a równocześnie jest znakomitym,
wszechstronnym narzędziem do tworzenia nowoczesnych aplikacji.
Programowanie w nim wymaga nieco wysiłku, ale pozwala
zarówno szybko przyswoić najważniejsze paradygmaty
informatyki, jak i wdrożyć się w pisanie kodu zgodne z dobrymi
praktykami. Przy tym C++ ma cechy nowoczesnego języka programowania, a
jego możliwości są poszerzane dzięki bibliotekom. Aby adept sztuki
programowania mógł skorzystać z tych wszystkich zalet,
potrzebuje pomocy dobrego nauczyciela lub dobrego podręcznika. Tylko w
ten sposób uniknie typowych błędów popełnianych
na skutek niewystarczającego zrozumienia podstaw programowania i
najważniejszych koncepcji programistycznych.
Oto
polska edycja popularnego podręcznika opartego na naukowych podstawach
skutecznego uczenia. To znakomite wprowadzenie do podstawowych technik
programowania i umiejętności projektowania pozwala łatwo, a przy tym
dogłębnie opanować elementarne pojęcia. W przystępny sposób
omawia najistotniejsze kwestie działania algorytmów i
rodzaje struktur danych. Krok po kroku przeprowadza czytelnika od
podstaw do bardziej zaawansowanych tematów związanych ze
współczesnymi aplikacjami, takich jak GUI i programowanie
XML. Poszczególne koncepcje zostały tu wyjaśnione z
wykorzystaniem trafnie dobranych schematów i grafik. Nie
zabrakło też wskazówek, przykładów i obszernych
fragmentów świetnie napisanego kodu, które
ułatwiają naukę, podobnie jak liczne ćwiczenia i studia
przypadków.
W tej książce między innymi:
- podstawowe koncepcje
programowania: struktury sterujące, tablice, wskaźniki
- programowanie obiektowe,
dziedziczenie, polimorfizm
- struktury danych: liniowe
i oparte na drzewach
- wprowadzenie do
algorytmów
- szablony i zarządzanie
pamięcią
ELEMENTY
KSIĄŻKI (16)
PRZEDMOWA (23)
1.
WPROWADZENIE (35)
1.1. Czym jest programowanie? (35)
1.2. Anatomia komputera (36)
IAS: Komputery są wszędzie (38)
1.3. Kod maszynowy i języki programowania (39)
IAS: Organizacje normalizacyjne (40)
1.4. Zapoznanie się ze środowiskiem programowania (41)
WDP: Kopie zapasowe (44)
1.5. Analiza pierwszego programu (45)
CPB: Pomijanie średników (47)
TS: Sekwencje ucieczki (48)
1.6. Błędy (49)
CPB: Błędna pisownia wyrazów (50)
1.7. Rozwiązywanie problemów: projektowanie
algorytmów (50)
1.7.1. Koncepcja algorytmu (51)
1.7.2. Algorytm rozwiązywania problemu stopy zwrotu (51)
1.7.3. Pseudokod (52)
1.7.4. Od algorytmów do programów (53)
JTZ: Opisywanie algorytmu za pomocą pseudokodu (54)
P: Napisanie algorytmu układania płytek podłogowych (55)
Podsumowanie rozdziału (57)
2.
PODSTAWOWE
TYPY DANYCH (59)
2.1. Zmienne (59)
2.1.1. Definicje zmiennych (60)
2.1.2. Typy liczbowe (61)
2.1.3. Nazwy zmiennych (62)
2.1.4. Instrukcja przypisania (63)
2.1.5. Stałe (65)
2.1.6. Komentarze (65)
CPB: Używanie niezdefiniowanych zmiennych (66)
CPB: Używanie niezainicjowanych zmiennych (66)
WDP: Wybieraj opisowe nazwy zmiennych (67)
WDP: Nie używaj sekretnych numerów (67)
TS: Typy liczbowe w C++ (68)
TS: Zakresy i precyzja liczb (69)
TS: Definiowanie zmiennych ze słowem auto (69)
2.2. Arytmetyka (69)
2.2.1. Operatory arytmetyczne (69)
2.2.2. Inkrementacja i dekrementacja (70)
2.2.3. Dzielenie całkowite i reszta z dzielenia (70)
2.2.4. Konwertowanie liczb zmiennoprzecinkowych na całkowite (71)
2.2.5. Potęgi i pierwiastki (72)
CPB: Niezamierzone dzielenie całkowite (74)
CPB: Niezamknięte nawiasy (74)
CPB: Zapominanie o plikach nagłówkowych (75)
CPB: Błędy zaokrąglenia (76)
WDP: Spacje w wyrażeniach (76)
TS: Rzutowania (77)
TS: Połączenie przypisania i działań arytmetycznych (77)
IAS: Błąd jednostki zmiennoprzecinkowej procesora Pentium (77)
2.3. Wejście i wyjście (79)
2.3.1. Wejście (79)
2.3.2. Formatowanie wyjścia (80)
2.4. Rozwiązywanie problemów: najpierw zrób to
ręcznie (82)
P: Obliczanie czasu podróży (83)
JTZ: Przeprowadzanie obliczeń (83)
P: Obliczenie kosztu znaczków pocztowych (86)
2.5. Ciągi (86)
2.5.1. Typ string (86)
2.5.2. Łączenie ciągów (87)
2.5.3. Wprowadzanie ciągów (87)
2.5.4. Funkcje ciągów (88)
IAS: Alfabety międzynarodowe i zestaw Unicode (91)
Podsumowanie rozdziału (92)
3.
DECYZJE
(93)
3.1. Instrukcja if (93)
CPB: Średnik po warunku if (96)
WDP: Układ nawiasów klamrowych (96)
WDP: Zawsze używaj nawiasów klamrowych (97)
WDP: Wcięcia (97)
WDP: Unikaj duplikowania kodu w gałęziach (98)
TS: Operator warunkowy (99)
3.2. Porównywanie liczb oraz znaków (99)
CPB: Mylenie operatora = z == (101)
CPB: Dokładne porównywanie liczb zmiennoprzecinkowych (102)
WDP: Doprowadź do kompilacji z brakiem ostrzeżeń (103)
TS: Alfabetyczna kolejność ciągów (103)
JTZ: Implementacja instrukcji if (104)
P: Wyodrębnianie ze środka (106)
IAS: Dysfunkcjonalne systemy komputerowe (106)
3.3. Wiele wariantów (107)
TS: Instrukcja switch (110)
3.4. Zagnieżdżone gałęzie (111)
CPB: Problem z zawieszonym słowem else (113)
WDP: Ręczne śledzenie kodu (114)
3.5. Rozwiązywanie problemów: schematy blokowe (116)
3.6. Rozwiązywanie problemów: przypadki testowe (119)
WDP: Opracuj harmonogram i zarezerwuj czas na nieoczekiwane problemy
(120)
3.7. Zmienne i operatory logiczne (121)
CPB: Łączenie wielu operatorów relacyjnych (124)
CPB: Mylenie warunków && i || (125)
TS: Skrócone obliczanie wartości operatorów
logicznych (126)
TS: Prawa de Morgana (126)
3.8. Zastosowanie: weryfikacja danych wejściowych (127)
IAS: Sztuczna inteligencja (129)
Podsumowanie rozdziału (131)
4.
PĘTLE
(133)
4.1. Pętla while (133)
CPB: Nieskończone pętle (138)
CPB: Nie myśl w kategoriach "Czy doszliśmy już do celu?" (138)
CPB: Pomyłki o jeden (139)
IAS: Pierwszy "bug" (140)
4.2. Rozwiązywanie problemów: ręczne śledzenie kodu (140)
4.3. Pętla for (143)
WDP: Używaj pętli tylko do tego, do czego została przeznaczona (147)
WDP: Wybierz zakres pętli odpowiedni do zadania (147)
WDP: Licz iteracje (148)
4.4. Pętla do (148)
WDP: Schematy blokowe pętli (149)
4.5. Przetwarzanie danych wejściowych (150)
4.5.1. Wartości wartownika (150)
4.5.2. Odczytywanie danych wejściowych do chwili niepowodzenia (151)
TS: Czyszczenie stanu błędu (153)
TS: "Pętla i pół" oraz instrukcja break (154)
TS: Przekierowywanie wejścia i wyjścia (154)
4.6. Rozwiązywanie problemów: scenopis (155)
4.7. Typowe algorytmy pętli (158)
4.7.1. Suma i średnia (158)
4.7.2. Zliczanie pasujących elementów (158)
4.7.3. Znajdowanie pierwszego pasującego elementu (159)
4.7.4. Monitowanie aż do skutku (159)
4.7.5. Maksimum i minimum (160)
4.7.6. Porównywanie sąsiednich wartości (160)
JTZ: Tworzenie pętli (161)
P: Przetwarzanie numerów kart kredytowych (165)
4.8. Zagnieżdżone pętle (165)
P: Manipulowanie pikselami obrazu (168)
4.9. Rozwiązywanie problemów: najpierw rozwiąż prostszy
problem (169)
4.10. Liczby losowe i symulacje (173)
4.10.1. Generowanie liczb losowych (174)
4.10.2. Symulowanie rzutów kostką (175)
4.10.3. Metoda Monte Carlo (176)
IAS: Piractwo cyfrowe (177)
Podsumowanie rozdziału (178)
5.
FUNKCJE
(181)
5.1. Funkcje jako czarne skrzynki (181)
5.2. Implementowanie funkcji (183)
WDP: Komentarze funkcji (185)
5.3. Przekazywanie parametrów (185)
WDP: Nie modyfikuj zmiennych parametrycznych (187)
5.4. Wartości zwracane (187)
CPB: Brak wartości zwracanej (188)
TS: Deklaracje funkcji (189)
JTZ: Implementowanie funkcji (190)
P: Generowanie losowych haseł (191)
P: Używanie debugera (191)
5.5. Funkcje bez wartości zwracanych (192)
5.6. Rozwiązywanie problemów: funkcje do ponownego
wykorzystania (193)
5.7. Rozwiązywanie problemów: uściślanie stopniowe (195)
WDP: Pilnuj, by funkcje były krótkie (200)
WDP: Śledzenie funkcji (200)
WDP: Atrapy (202)
P: Obliczanie oceny z przedmiotu (202)
5.8. Zakres zmiennej i zmienne globalne (202)
WDP: Unikaj zmiennych globalnych (204)
5.9. Parametry referencyjne (204)
WDP: Preferuj wartości zwracane zamiast parametrów
referencyjnych (208)
TS: Stałe referencje (209)
5.10. Funkcje rekurencyjne (opcjonalnie) (209)
JTZ: Wnioskowanie rekurencyjne (212)
IAS: Nagłe rozpowszechnienie się komputerów osobistych (214)
Podsumowanie rozdziału (215)
6.
TABLICE I WEKTORY (217)
6.1. Tablice (217)
6.1.1. Definiowanie tablic (217)
6.1.2. Dostęp do elementów tablicy (219)
6.1.3. Częściowo wypełnione tablice (221)
CPB: Przekroczenie zakresu (222)
WDP: Używaj tablic do przechowywania serii związanych ze sobą wartości
(222)
IAS: Wirusy komputerowe (222)
6.2. Typowe algorytmy tablicowe (224)
6.2.1. Wypełnianie wartościami (224)
6.2.2. Kopiowanie (224)
6.2.3. Suma i średnia (225)
6.2.4. Maksimum i minimum (225)
6.2.5. Separatory elementów (225)
6.2.6. Zliczanie pasujących elementów (226)
6.2.7. Wyszukiwanie liniowe (226)
6.2.8. Usuwanie elementu (227)
6.2.9. Wstawianie elementu (227)
6.2.10. Przestawianie elementów (229)
6.2.11. Odczyt danych wejściowych (230)
TS: Sortowanie za pomocą biblioteki C++ (231)
TS: Algorytm sortowania (231)
TS: Wyszukiwanie binarne (233)
6.3. Tablice a funkcje (234)
TS: Stałe parametry tablicowe (237)
6.4. Rozwiązywanie problemów: dostosowywanie
algorytmów (238)
JTZ: Praca z tablicami (240)
P: Rzut kostką (243)
6.5. Rozwiązywanie problemów: odkrywanie
algorytmów przez manipulację obiektami fizycznymi (244)
6.6. Tablice dwuwymiarowe (246)
6.6.1. Definiowanie tablic dwuwymiarowych (247)
6.6.2. Dostęp do elementów (248)
6.6.3. Lokalizowanie sąsiadujących elementów (248)
6.6.4. Obliczanie sum wierszy i kolumn (249)
6.6.5. Dwuwymiarowe parametry tablicowe (250)
CPB: Pomijanie rozmiaru kolumny w dwuwymiarowym parametrze tablicowym
(253)
P: Tabela danych o ludności świata (253)
6.7. Wektory (253)
6.7.1. Definiowanie wektorów (254)
6.7.2. Powiększanie i zmniejszanie wektorów (255)
6.7.3. Wektory a funkcje (256)
6.7.4. Algorytmy związane z wektorami (257)
6.7.5. Wektory dwuwymiarowe (259)
WDP: Stosuj wektory zamiast tablic (260)
TS: Pętla for oparta na zakresie (260)
Podsumowanie rozdziału (261)
7.
WSKAŹNIKI
I STRUKTURY (263)
7.1. Definiowanie i używanie wskaźników (264)
7.1.1. Definiowanie wskaźników (264)
7.1.2. Dostęp do zmiennych poprzez wskaźniki (265)
7.1.3. Inicjowanie wskaźników (266)
CPB: Mylenie wskaźników z danymi, na które
wskazują (268)
WDP: Używaj oddzielnej definicji dla każdej zmiennej wskaźnikowej (269)
TS: Wskaźniki i referencje (269)
7.2. Tablice i wskaźniki (270)
7.2.1. Tablice jako wskaźniki (270)
7.2.2. Arytmetyka wskaźnikowa (271)
7.2.3. Tablicowe zmienne parametryczne są wskaźnikami (272)
TS: Przechodzenie po tablicy przy użyciu wskaźnika (273)
CPB: Zwracanie wskaźnika wskazującego na zmienną lokalną (274)
WDP: Programuj przejrzyście, a nie sprytnie (275)
TS: Stałe wskaźniki (275)
7.3. Ciągi w językach C i C++ (276)
7.3.1. Typ char (276)
7.3.2. Ciągi w stylu C (276)
7.3.3. Tablice znaków (277)
7.3.4. Konwertowanie pomiędzy ciągami w stylu C i C++ (278)
7.3.5. Ciągi w stylu C++ i operator [] (278)
TS: Praca z ciągami w stylu C (279)
7.4. Dynamiczna alokacja pamięci (281)
CPB: Wiszące wskaźniki (283)
CPB: Wycieki pamięci (284)
7.5. Tablice i wektory wskaźników (285)
7.6. Rozwiązywanie problemów: rysowanie schematu (288)
JTZ: Praca ze wskaźnikami (289)
P: Tworzenie korespondencji masowej (291)
IAS: Systemy wbudowane (291)
7.7. Struktury (292)
7.7.1. Typy strukturalne (292)
7.7.2. Przypisania struktur i ich porównywanie (293)
7.7.3. Funkcje a struktury (294)
7.7.4. Tablice struktur (294)
7.7.5. Struktury ze składowymi tablicowymi (295)
7.7.6. Struktury zagnieżdżone (295)
7.8. Wskaźniki a struktury (296)
7.8.1. Wskaźniki do struktur (296)
7.8.2. Struktury ze składowymi wskaźnikowymi (297)
TS: Wskaźniki inteligentne (298)
Podsumowanie rozdziału (299)
8.
STRUMIENIE
(301)
8.1. Odczytywanie i zapisywanie plików tekstowych (301)
8.1.1. Otwieranie strumienia (302)
8.1.2. Odczyt z pliku (303)
8.1.3. Zapis do pliku (304)
8.1.4. Przykład przetwarzania pliku (304)
8.2. Odczyt tekstowych danych wejściowych (307)
8.2.1. Odczyt wyrazów (307)
8.2.2. Odczyt znaków (307)
8.2.3. Odczyt wierszy (309)
CPB: Łączenie operacji wejścia przy użyciu operatora >> i
funkcji getline (310)
TS: Sprawdzanie błędu strumienia (311)
8.3. Zapisywanie tekstowych danych wyjściowych (312)
TS: Standard Unicode, kodowanie UTF-8 i ciągi C++ (314)
8.4. Analizowanie i formatowanie ciągów (315)
8.5. Argumenty wiersza poleceń (317)
IAS: Algorytmy szyfrowania (320)
JTZ: Przetwarzanie plików tekstowych (321)
P: Wyszukiwanie duplikatów (324)
8.6. Dostęp swobodny i pliki binarne (324)
8.6.1. Dostęp swobodny (324)
8.6.2. Pliki binarne (325)
8.6.3. Przetwarzanie plików z obrazami (326)
IAS: Bazy danych a prywatność (329)
Podsumowanie rozdziału (330)
9.
KLASY
(333)
9.1. Programowanie obiektowe (334)
9.2. Implementowanie prostej klasy (335)
9.3. Określanie interfejsu publicznego klasy (338)
CPB: Zapominanie o średniku (340)
9.4. Projektowanie reprezentacji danych (341)
9.5. Funkcje składowe (342)
9.5.1. Implementowanie funkcji składowych (342)
9.5.2. Parametry jawne i niejawne (343)
9.5.3. Wywoływanie funkcji składowej wewnątrz innej funkcji składowej
(344)
WDP: Wszystkie dane składowe powinny być prywatne, a większość funkcji
- publiczna (347)
WDP: Poprawne użycie słowa zastrzeżonego const (347)
9.6. Konstruktory (348)
CPB: Próba wywołania konstruktora (350)
TS: Przeciążanie (351)
TS: Listy inicjatorów (351)
TS: Uniwersalna i jednolita składnia inicjacji (352)
9.7. Rozwiązywanie problemów: śledzenie obiektów
(353)
JTZ: Implementowanie klasy (355)
P: Implementowanie klasy reprezentującej konto bankowe (358)
IAS: Elektroniczne maszyny do głosowania (358)
9.8. Rozwiązywanie problemów: znajdowanie klas (360)
WDP: Przekształcaj wektory równoległe w wektory
obiektów (361)
9.9. Osobna kompilacja (363)
9.10. Wskaźniki do obiektów (367)
9.10.1. Obiekty alokowane dynamicznie (367)
9.10.2. Operator -> (368)
9.10.3. Wskaźnik this (369)
9.11. Rozwiązywanie problemów: wzorce danych obiektu (369)
9.11.1. Przechowywanie sumy całkowitej (370)
9.11.2. Liczenie zdarzeń (371)
9.11.3. Gromadzenie danych (371)
9.11.4. Zarządzanie właściwościami obiektu (372)
9.11.5. Modelowanie obiektów o różnych stanach
(373)
9.11.6. Opisywanie pozycji obiektu (374)
IAS: Oprogramowanie o otwartych źródłach i wolne
oprogramowanie (375)
Podsumowanie rozdziału (376)
10.
DZIEDZICZENIE
(379)
10.1. Hierarchie dziedziczenia (379)
10.2. Implementowanie klas pochodnych (383)
CPB: Dziedziczenie prywatne (386)
CPB: Replikowanie składowych klasy bazowej (386)
WDP: Przy odmiennych wartościach należy używać jednej klasy, przy
odmiennym działaniu - dziedziczenia (387)
TS: Wywoływanie konstruktora klasy bazowej (387)
10.3. Przesłanianie funkcji składowych (388)
CPB: Zapominanie o podaniu nazwy klasy bazowej (391)
10.4. Funkcje wirtualne i polimorfizm (391)
10.4.1. Problem odcinania (392)
10.4.2. Wskaźniki do klasy bazowej i pochodnej (393)
10.4.3. Funkcje wirtualne (394)
10.4.4. Polimorfizm (395)
WD: Nie używaj znaczników typów (398)
CPB: Odcinanie obiektu (398)
CPB: Nieudane przesłanianie funkcji wirtualnej (399)
TS: Wirtualne samowywołania (400)
JTZ: Opracowywanie hierarchii dziedziczenia (400)
P: Implementowanie hierarchii pracowników a potrzeby
przetwarzania odcinków wypłat (406)
IAS: Kto sprawuje kontrolę nad internetem? (406)
Podsumowanie rozdziału (408)
11.
REKURENCJA
(409)
11.1. Liczby trójkątne (409)
CPB: Śledzenie wykonania funkcji rekurencyjnych (413)
CPB: Nieskończona rekurencja (414)
JTZ: Wnioskowanie rekurencyjne (415)
P: Znajdowanie plików (418)
11.2. Rekurencyjne funkcje pomocnicze (418)
11.3. Wydajność rekurencji (419)
11.4. Permutacje (423)
11.5. Rekurencja wzajemna (426)
11.6. Poszukiwanie z nawrotami (430)
P: Wieże Hanoi (436)
IAS: Ograniczenia obliczeń komputerowych (436)
Podsumowanie rozdziału (439)
12.
SORTOWANIE I WYSZUKIWANIE (441)
12.1. Sortowanie przez wybieranie (441)
12.2. Profilowanie algorytmu sortowania przez wybieranie (444)
12.3. Analiza wydajności algorytmu sortowania przez wybieranie (445)
TS: O, omega i theta (447)
TS: Sortowanie przez wstawianie (449)
12.4. Sortowanie przez scalanie (450)
12.5. Analiza algorytmu sortowania przez scalanie (453)
TS: Algorytm sortowania szybkiego (456)
12.6. Wyszukiwanie (457)
12.6.1. Wyszukiwanie liniowe (457)
12.6.2. Wyszukiwanie binarne (459)
WDP: Funkcje biblioteczne do sortowania i wyszukiwania binarnego (462)
TS: Definiowanie kolejności sortowania obiektów (462)
12.7. Rozwiązywanie problemów: szacowanie czasu wykonania
algorytmu (463)
12.7.1. Czas liniowy (463)
12.7.2. Czas kwadratowy (464)
12.7.3. Wzór trójkąta (465)
12.7.4. Czas logarytmiczny (467)
P: Ulepszanie algorytmu sortowania przez wstawianie (468)
IAS: Pierwsza programistka (468)
Podsumowanie rozdziału (469)
13.
ZAAWANSOWANE
CECHY JĘZYKA C++ (471)
13.1. Przeciążanie operatorów (471)
13.1.1. Funkcje operatorów (472)
13.1.2. Przeciążanie operatorów porównania (474)
13.1.3. Wejście i wyjście (475)
13.1.4. Operatory składowe (476)
TS: Przeciążanie operatorów inkrementacji i dekrementacji
(476)
TS: Niejawne konwersje typów (478)
TS: Zwracanie referencji (479)
P: Klasa Fraction (480)
13.2. Automatyczne zarządzanie pamięcią (480)
13.2.1. Konstruktory przydzielające pamięć (480)
13.2.2. Destruktory (482)
13.2.3. Przeciążanie operatora przypisania (483)
13.2.4. Konstruktory kopiujące (488)
WDP: Używaj parametrów referencyjnych, by nie tworzyć kopii
obiektów (492)
CPB: Definiowanie destruktora bez pozostałych dwu funkcji z "wielkiej
trójki" (492)
TS: Wirtualne destruktory (493)
TS: Powstrzymanie automatycznego tworzenia funkcji zarządzających
pamięcią (494)
TS: Operacje przenoszenia (494)
TS: Wskaźniki współdzielone (496)
P: Śledzenie zarządzania pamięcią w obiektach typu String (496)
13.3. Szablony (497)
13.3.1. Szablony funkcji (497)
13.3.2. Szablony klas (499)
TS: Parametry szablonów niedotyczące typów (501)
Podsumowanie rozdziału (502)
14.
LISTY
POWIĄZANE, STOSY I KOLEJKI (503)
14.1. Używanie list powiązanych (503)
14.2. Implementowanie list powiązanych (509)
14.2.1. Klasy dla list, węzłów i iteratorów (509)
14.2.2. Implementowanie iteratorów (511)
14.2.3. Implementowanie wstawiania i usuwania węzłów (512)
P: Implementowanie szablonu listy powiązanej (522)
14.3. Wydajność operacji na listach, tablicach i wektorach (523)
14.4. Stosy i kolejki (527)
14.5. Implementowanie stosów i kolejek (530)
14.5.1. Stosy jako listy powiązane (530)
14.5.2. Stosy jako tablice (533)
14.5.3. Kolejki jako listy powiązane (534)
14.5.4. Kolejki jako tablice cykliczne (535)
14.6. Zastosowania stosów i kolejek (536)
14.6.1. Sprawdzanie zamknięcia nawiasów (536)
14.6.2. Obliczanie wyrażeń zapisanych w odwrotnej notacji polskiej (537)
14.6.3. Obliczanie wartości wyrażeń algebraicznych (539)
14.6.4. Poszukiwanie z nawrotami (543)
TS: Odwrotna notacja polska (544)
Podsumowanie rozdziału (545)
15.
ZBIORY,
MAPY I TABLICE MIESZAJĄCE
(547)
15.1. Zbiory (547)
15.2. Mapy (551)
WDP: W przypadku iteratorów używaj typu auto (555)
TS: Multizbiory i multimapy (555)
P: Częstość występowania wyrazów (556)
15.3. Implementowanie tablicy mieszającej (556)
15.3.1. Skróty (556)
15.3.2. Tablice mieszające (558)
15.3.3. Znajdowanie elementu (559)
15.3.4. Dodawanie i usuwanie elementów (560)
15.3.5. Przechodzenie po tablicy mieszającej (560)
TS: Implementowanie funkcji skrótów (566)
TS: Adresowanie otwarte (568)
Podsumowanie rozdziału (570)
16.
STRUKTURY
DRZEW (571)
16.1. Podstawowe koncepcje dotyczące drzew (571)
16.2. Drzewa binarne (575)
16.2.1. Przykłady drzew binarnych (575)
16.2.2. Drzewa zrównoważone (577)
16.2.3. Implementacja drzewa binarnego (578)
P: Budowanie drzewa Huffmana (580)
16.3. Binarne drzewa poszukiwań (580)
16.3.1. Właściwość wyszukiwania binarnego (580)
16.3.2. Wstawianie (582)
16.3.3. Usuwanie (584)
16.3.4. Wydajność operacji (586)
16.4. Przeglądanie drzewa (591)
16.4.1. Przeglądanie poprzeczne (591)
16.4.2. Przeglądanie wzdłużne i wsteczne (593)
16.4.3. Wzorzec Wizytator (594)
16.4.4. Przeszukiwanie w głąb i wszerz (595)
16.4.5. Iteratory drzew (596)
16.5. Drzewa czerwono-czarne (597)
16.5.1. Podstawowe własności drzew czerwono-czarnych (597)
16.5.2. Wstawianie (600)
16.5.3. Usuwanie (601)
P: Implementowanie drzewa czerwono-czarnego (605)
Podsumowanie rozdziału (605)
17.
KOLEJKI PRIORYTETOWE I KOPCE (607)
17.1. Kolejki priorytetowe (607)
P: Symulacja kolejki oczekujących klientów (610)
17.2. Kopce (610)
17.3. Algorytm sortowania przez kopcowanie (621)
Podsumowanie rozdziału (626)
A ZESTAWIENIE SŁÓW ZASTRZEŻONYCH (627)
B ZESTAWIENIE OPERATORÓW (631)
C KODY ZNAKÓW (633)
D PRZEGLĄD BIBLIOTEKI C++ (637)
E WYTYCZNE DOTYCZĄCE PROGRAMOWANIA W JĘZYKU C++ (643)
F SYSTEMY LICZBOWE (651)
SŁOWNICZEK (661)
ŹRÓDŁA ILUSTRACJI (671)
ŚCIĄGAWKA (673)
680
stron, Format: 17.0x24.0cm , oprawa twarda