Kontenery STL’owe – std::vector, std::map, przydatne i miłe, i nie ma w tym stwierdzeniu nic rewolucyjnego, ale jest jeszcze jeden kontener, który może ułatwić nam życie – mianowicie std::basic_string.
Jakie basic_string? jest string i już!
Otóż std::string to tylko specjalizacja szablonu std::basic_string, może wyglądać następująco:
typedef std::basic_string<char> string;
No ale na co to komu potrzebne?
Załóżmy, że mamy aplikację która odczytuje dane binarne z pliku. Moglibyśmy stosować wskaźnik na tablice (const unsigned char*), ale wtedy wszystkie operacje na stringach trzeba wykonywać przy pomocy api odziedziczonego z C, a chyba nie całkiem o to chodzi, bo jeżeli nasz ciąg będzie zawierał null‘e jako separatory to już nie bedzie tak fajnie. No ale przecież można skorzystać z wektora i nie zawracać sobie głowy jakimśtam basic_string. Owszem można, ale dziedzicząc po basic_string otrzymujemy wszystkie metody dostępne dla std::string i tak może to wyglądać:
typedef std::string<unsigned char> ustring;
ustring line;
// tu sobie wczytujemy, zmienna line ma 300 znaków
// a na chwilę obecną potrzebujemy ich 30
ustring elem = line.substr( 0, 30 );
// i kolejne 30
ustring elem1 = line.substr( 30, 60 ); // itd
To jako podsumowanie jeszcze tylko pobieranie tablicy którą kontener zarządza:
const unsigned char* arr = line.c_str();
Pewnie jeszcze możnaby się rozpisywać o wstring, ale to już zostawię do samodzielnego zgłębienia czytelnikowi.