2009-05-07 2 views
26

저는 C++ 응용 프로그램을 작성 중이며 메모리에 바이트 배열을 저장하는 C++의 일반적인 방법이 궁금합니다.C++ STL의 문자열 이진 데이터에 대한 eqivalent

특별히 바이너리 데이터를 제외하고는 문자열과 같은 것이 있습니까?

지금은 데이터를 저장하기 위해 * unsigned char ** 배열을 사용하고 있지만 더 많은 STL/C++를 사용하는 것이 더 좋을 것입니다.

+0

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

답변

35

std::vector<unsigned char>을 사용하고 싶습니다. 필요한 대부분의 작업은 반복기 범위가있는 STL을 사용하여 수행 할 수 있습니다. 또한 실제 데이터가 필요하다면 &v[0]은 기본 배열에 대한 포인터를 제공한다는 보장이 있습니다.

+3

v.data()가 더 명확 할 때'& v [0]'에 의존 할 필요가 없습니다. –

+3

@LimitedAtonement 실제로 2009 년'data()'는'std :: vector'에 정의되지 않았습니다. –

23

이진 데이터의 경우에도 std::string을 사용할 수 있습니다. std::string의 데이터 길이는 명시 적으로 저장되며 Null 종료에 의해 결정되지 않으므로 Null 바이트는 std::string에 특별한 의미가 없습니다.

std::string은 이진 데이터로 작업하는 데 유용하지만 vector으로는 제공되지 않는 많은 방법을 제공하기 때문에 종종 std::vector<char>보다 편리합니다. 바이너리 데이터를 파싱/생성하려면 substr()과 같은 것이 유용하며 +std::stringstream에 대한 과부하가 유용합니다. 벡터에서는 <algorithm>의 알고리즘을 사용하여 동일한 효과를 얻을 수 있지만 문자열 메서드보다 더 어색합니다. "문자 시퀀스"에 대해서만 수행하면 std::string은 "바이너리"데이터가 포함 된 경우에도 일반적으로 원하는 방법을 제공합니다.

+5

또는 std :: vector <부호없는 문자> – lothar

+0

std :: vector <부호없는 문자>. – xian

+1

std :: vector 는 내용을/writable/char 포인터 (& vec [0]에 의해)로 얻을 수 있다는 장점이 있습니다. 반면 std :: string 구현에서는 copy-on-write 최적화가 일반적이지 않습니다. – bdonlan

19

std::vector<unsigned char> 또는 std::vector<uint8_t> (현대 stdint.h 헤더가있는 경우)을 사용해야합니다. 고정 크기 버퍼로 작업하는 경우 unsigned char[] 또는 uint8_t[]을 사용하면 아무런 문제가 없습니다. std::vector이 정말 빛나는 곳은 자라나 버퍼를 자주 추가해야하는 경우입니다. STL 반복자는 포인터와 동일한 의미를 갖기 때문에 STL 알고리즘은 std::vector 및 일반 오래된 배열에서도 똑같이 작동합니다.

CAdaker에서 지적했듯이 &v[0]이라는 표현식은 벡터의 버퍼에 대한 기본 포인터를 제공한다는 보장이 있습니다. 이는 하나의 인접한 메모리 블록임을 보장합니다. 이 보증은 C++ 표준의 부록에 추가되었습니다.

필자는 개인적으로 임의의 바이트 버퍼를 조작하는 데 개인적으로는 std::string을 사용하지 않는 것이 좋습니다. 잠재적으로 혼란 스럽기 때문에 개인적으로는 사용하지 않을 것입니다.