Standardowe udogodnienia biblioteki języka C++, dedykowane przetwarzaniu napisów, pozostawiają wiele do życzenia. Wielu programistów uważa, że klasa std::string to jedna z większych wpadek twórców standardu tego języka. Szablon std::basic_string jest przykładem klasy o rozdmuchanym, niespójnym interfejsie, mało intuicyjnej w użyciu, udającej kontener STL, ale nie będącej nim do końca i nieelastycznej. Jeśli nie wierzysz, to spróbuj przy pomocy std::basic_string wykonać operację przycięcia zbędnych znaków (np. spacji) z początku i końca napisu (ang. trimming).
Oczywiście, da się to zrobić – po uprzednim zapoznaniu się z takimi metodami klasy std::string jak find_first_not_of, find_last_not_of oraz erase (patrz: Listing 1). Ale czy nie można by zrobić tego prościej…? A co w sytuacji, kiedy nasz napis reprezentowany jest jako wektor char’ów?
Zanim załamiesz ręce, poczekaj! Na szczęście – jest…
…światełko w tunelu…
…w postaci biblioteki Boost String Algorithms. Biblioteka ta oferuje uogólnione (ang. generic) implementacje algorytmów działających na napisach, których brakuje w bibliotece standardowej języka C++. Algorytmy te można sklasyfikować w ramach kilku podstawowych grup: operacje przycinania napisów (ang. trimming), operacje konwersji znaków (ang. case conversion) oraz funkcje służące do wyszukiwania, zamiany i usuwania ciągów znaków (ang. search, replace, erase).
Boost String Algorithms skonstruowana jest w sposób, który nie ogranicza jej do współpracy z jednym, z góry narzuconym typem kontenera (np. std::string). W kontekście tej biblioteki pojęcie napis oznacza sekwencję znaków przechowywanych w dowolnym kontenerze. Podobnie, pod pojęciem znak niekoniecznie muszą kryć się typy char i wchar_t.
Prezentowana biblioteka jest częścią pakietu Boost; jako że składa się ona z samych plików nagłówkowych, jej konfiguracja jest bardzo prosta: wystarczy pouczyć kompilator, gdzie ma szukać nagłówków.
Więcej informacji na temat konfiguracji biblioteki znajdziesz w ramce Szybki Start.
Pierwszy przykład
Zanim rozważymy szczegółowo możliwości biblioteki Boost String Algorithms, spójrzmy na krótki, prosty przykład jej użycia (patrz: Listing 2).
Zadanie, które ma zrealizować nasz przykład, jest bardzo proste: chcemy usunąć białe znaki z początku i końca napisu, a następnie stworzyć nowy napis będący kopią poprzedniego, z tą różnicą, że wszystkie litery z oryginalnego napisu zamienione będą na małe. Boost String Algorithms pozwala zrealizować to zadanie za pomocą dwóch prostych, intuicyjnych funkcji. Morał z tego przykładu jest następujący: nie mając pod ręką odpowiedniej biblioteki, musielibyśmy funkcje do przycinania i konwersji zaimplementować sami. Niby prosta rzecz, aczkolwiek nie do końca. Jeśli tworzony przez nas kod miałby być kodem produkcyjnym, to należałoby poważnie zastanowić się nad takimi aspektami jak: poprawność (szczegółowe rozważenie wszystkich przypadków użycia), wydajność, rozszerzalność, obsługa błędów itd. Trzeba by zapewne zaprojektować i zaimplementować zestaw testów modułowych. Krótko mówiąc, trywialne zdanie, które chcielibyśmy rozwiązać w kilka sekund, urasta nam nagle do rozmiarów tworzenia własnej biblioteki – co już trywialnym zadaniem nie jest.
Dla odmiany, Boost String Algorithms daje nam dokładnie to, czego potrzebujemy: proste, dobrze przetestowane, wydajne implementacje operacji na napisach. Wystarczy dołączyć właściwy nagłówek (#include <boost/algorithm/string.hpp>) i po kłopocie. Aż chciałoby się zacytować motto użytkowników języka Perl: niechaj proste rzeczy pozostaną proste.