Biblioteka standardowa: Wstęp
Wprowadzenie
Biblioteka standardowa C++ jest właściwie jedną z "ostatnich" dopracowanych (no, mniej więcej) części C++. Wszelkie opisane tu właściwości wypada znać i bezwzględnie stosować raczej, niż innych bibliotek o podobnych właściwościach. Nie mówię tego na próżno, bowiem wiele takowych powstało. Powstało też nie bez powodu - w każdym programowaniu potrzeba operować różnymi standardowymi strukturami danych, a jak ich nie było, to każdy deklarował swoje. Dlatego implementacje różnych dynamicznych tablic, list, zbiorów, a także napisów można spotkać w bardzo wielu bibliotekach.
Jedną z ostatnich części biblioteki standardowej jest STL. Jedną z pierwszych, o ile pamiętam, iostream i complex. Po drodze one się jeszcze sporo zmieniały, bo np. complex kiedyś było klasą z polami typu double, a aktualnie jest wzorcem (a tamta postać istnieje jako double_complex). Biblioteki iostream* też przeszły trochę transformacji, m.in. rozdzielono je na ios, iosfwd, istream i ostream, poza tym też zostały zaimplementowane jako wzorce, by umożliwić operowanie na stringu unikodowym. Klasa String z kolei jest też - co może jest nieco dziwne - jedną z późniejszych klas. No i jednymi z ostatnich są te standardowe typy wyjątków.
Jedną z rzeczy, którą ustalono wręcz "w ostatniej chwili" były przestrzenie nazw, w związku z czym utworzono przestrzeń nazw "std", w której znajdują się wszystkie definiowane przez bibliotekę standardową symbole.
Pliki nagłówkowe
Oto pełna lista standardowych plików nagłówkowych C++: <algorithm>, <bitset>, <cassert>, <cctype>, <cerrno>, <cfloat>, <ciso646>, <climits>, <clocale>, <cmath>, <complex>, <csetjmp>, <csignal>, <cstdarg>, <cstddef>, <cstdio>, <cstdlib>, <cstring>, <ctime>, <cwchar>, <cwctype>, <deque>, <exception>, <fstream>, <functional>, <iomanip>, <iosfwd>, <ios>, <iostream>, <istream>, <iterator>, <limits>, <list>, <locale>, <map>, <memory>, <new>, <numeric>, <ostream>, <queue>, <set>, <sstream>, <stack>, <stdexcept>, <streambuf>, <string>, <typeinfo>, <utility>, <valarray>, <vector>.
Omówię teraz po kolei nagłówki względem kategorii.
Operacje wejścia-wyjścia
Operacje wejścia-wyjścia to podstawowe operacje tzw. komunikacji strumieniowej. Należą do tego głównie operacje na plikach i strumieniach standardowych.
- iosfwd i ios z definicjami pierwotnymi
- streambuf, istream, ostream i iostream, podstawowe klasy operujące abstrakcyjnym "io" (plus strumienie standardowe)
- iomanip, manipulatory strumieni
- fstream, klasy operacji na plikach
- sstream, klasy operacji na strumieniach tekstowych
- cstdio, operacje "io" zgodne z biblioteką standardową C
Operacje na tekstach
Operacje na tekstach składają się z najróżniejszych operacji na tablicach znaków, implementowanych w różny sposób. Tu wyraźnie rozróżnia się typy tekstowe statyczne, czy też surowe (operujące tablicami surowymi i wskaźnikami) oraz typ string.
- string z definicją typu string
- cctype, cwctype i cwchar, funkcje klasyfiujące pojedyncze znaki
- cstring, funkcje do obsługi stringów surowych (tablic znaków)
- locale, clocale obsługa internacjonalizacji
Wyjątki
Wyjątki oczywiście mogą być dowolnego typu, ale lepiej jest trzymać się pewnej konwencji hierarchizacji typów wyjątków.
- exception, definiuje podstawowe elementy wyjątków: abstrakcyjną klasę exception oraz funkcje set_terminate i set_unexpected.
- stdexcept, definiuje standardowe klasy wyjątków
- csetjmp, definiuje funkcje obsługi sytuacji wyjątkowych w stylu C