2009-05-07 22 views
26

Piszę aplikację C++ i zastanawiałem się, co konwencjonalny sposób przechowywania C++ w tablicy bajtów w pamięci.C++ STL's eqivalent String dla danych binarnych

Czy jest coś takiego jak ciąg znaków, z wyjątkiem danych binarnych.

W tej chwili używam tablicy * unsigned char ** do przechowywania danych, ale coś bardziej podobnego do STL/C++ byłoby lepsze.

+0

Duplikat http://stackoverflow.com/questions/441203/proper-way-to-store-binary-data-with-c-stl –

Odpowiedz

35

Użyłbym std::vector<unsigned char>. Większość operacji, które potrzebujesz, może być wykonana przy użyciu STL z zakresami iteratorów. Pamiętaj też, że jeśli naprawdę potrzebujesz nieprzetworzonych danych, gwarantowane jest podanie wskaźnika do podstawowej tablicy.

+3

Nie trzeba polegać na '& v [0]', gdy 'v.data()' jest bardziej przejrzysty. –

+3

@LimitedAtonement Rzeczywiście, jednak w 2009 r. 'Data()' nie zostało zdefiniowane w 'std :: vector'. –

23

Możesz użyć std::string również dla danych binarnych. Długość danych w std::string jest przechowywana jawnie i nie jest określana przez zerowe zakończenie, więc puste bajty nie mają specjalnego znaczenia w std::string.

std::string jest często bardziej wygodny niż std::vector<char>, ponieważ zapewnia wiele metod przydatnych do pracy z danymi binarnymi, ale nie dostarczanych przez vector. Aby parsować/tworzyć dane binarne, przydatne jest posiadanie takich rzeczy jak substr(), przeciążenia dla + i std::stringstream do twojej dyspozycji. Na wektorach algorytmy z <algorithm> mogą być użyte do osiągnięcia tych samych efektów, ale są bardziej niezgrabne niż metody łańcuchowe. Jeśli po prostu działasz na "sekwencjach znaków", std::string daje ci metody, których zwykle potrzebujesz, nawet jeśli sekwencje te zawierają dane "binarne".

+5

lub std :: wektor lothar

+0

Chciałbym również użyć standardowego :: wektor . – xian

+1

std :: vector ma tę zaletę, że można uzyskać jego zawartość jako wskaźnik/zapis/char (przez & vec [0]). Z drugiej strony nie uzyskuje się powszechnej optymalizacji kopiowania przy zapisie w implementacjach std :: string. – bdonlan

19

Powinieneś użyć std::vector<unsigned char> lub std::vector<uint8_t> (jeśli masz nowoczesny nagłówek stdint.h). Nie ma nic złego w korzystaniu z unsigned char[] lub uint8_t[], jeśli pracujesz z buforami o stałym rozmiarze. Gdzie naprawdę świeci std::vector, gdy trzeba często się powiększać lub dołączać do buforów. Iteratory STL mają tę samą semantykę co wskaźniki, więc algorytmy STL będą działać równie dobrze z std::vector i zwykłymi starymi tablicami.

I jak zauważył CAdaker, wyrażenie &v[0] gwarantuje podanie podstawowego wskaźnika do bufora wektora (i gwarantuje, że będzie to jeden ciągły blok pamięci). Ta gwarancja została dodana w addendum do standardu C++.

Osobiście nie użyłbym std::string do manipulowania arbitralnymi buforami bajtów, ponieważ uważam, że jest to potencjalnie mylące, ale nie jest to niesłychana praktyka.

Powiązane problemy