Posts tagged ‘stl’

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.