2016-11-23 9 views
3

Qt C++ 11 함수를 표준 C++ 11로 이식하려고합니다. 이 함수에는 어떤 종류의 데이터 (텍스트, 이진 데이터 등)를 받아들이고 데이터에서 해시를 계산하는 QByteArray 매개 변수가 있습니다.QByteArray에 대한 표준 대체

QByteArray는 모든 종류의 데이터를 수행 할 수 있기 때문에 적합 보인다 그것은 심지어 fromRawData()를 사용하여 깊은 사본을하지 않고 데이터를 포장 수 등 스트림, 장치, 문자열, 에서 충전 할 수 있도록하는 기능을 많이 가지고 있습니다.

비슷한 유연성을 제공하는 표준 C++ 11 솔루션이 있습니까? 현재 나는 좋은 오래된 void* 크기를 사용하는 경향이 있습니다.

+0

[STL 컨테이너] (http://en.cppreference.com/w/cpp/container)에는 (부호없는) 문자 배열을 저장할 수 있습니다. –

+0

@Raw N : 깊은 복사없이 포인터와 크기 (또는 C 문자열)에서'vector '를 어떻게 초기화 할 수 있습니까? – Silicomancer

+0

'myVector.assign (pointer, pointer + size)'아마도? 약 7 명의 [다른 생성자] (http://en.cppreference.com/w/cpp/container/vector/vector)도 있습니다. –

답변

3

비슷한 유연성을 제공하는 표준 C++ 11 솔루션이 있습니까? 현재 나는 좋은 오래된 무효 * 크기를 사용하는 경향이 있습니다.

다른 사람이 관리하는 자체 메모리 또는 랩 메모리를 관리 할 수있는 컨테이너를 제공하는 표준 C++ 11 솔루션이 없습니다.

QByteArray (몇 개의 파일)을 복사하고 라이선스 조건에 허용되면 프로젝트와 함께 묶을 수 있습니다.

그렇지 않으면 모든 요소에 대해 연속 된 저장소가있는 컨테이너에서만 작업하려는 경우 const void*size_t 인수가 가장 적합하며 가장 휴대하고 적응할 수 있습니다. 필요에 따라 편리한 과부하를 제공 할 수 있습니다. 예 : 어떤 용기 불연속 보관소 심지어을 지원하기

HashType calculateHash(const void*, size_t); 

template <typename T> HashType calculateHash(const T& container) { 
    static_assert(sizeof(typename T::value_type) == 1, "value_type must be byte-sized"); 
    assert(&container[container.size()-1] == &container[0]+container.size()); 
    return calculateHash(&container[0], container.size()); 
} 

는베이스 calculateHash는 범위를 가지고, 전체 컨테이너 해싱 과부하를 제공 할 수있다.

template <typename I> 
HashType calculateHash(I start, I const end) { 
    HashType hash; 
    for (; start != end; ++start) 
    hash.update(*start); 
    return hash; 
} 

template <typename C> 
HashType calculateHash(const C& container) { 
    using std::begin; 
    using std::end; 
    return calculateHash(begin(container), end(container)); 
} 
3

QByteArray와 같은 복잡한 기능을 가진 표준 컨테이너 같은 것을 알지는 못하지만, std::vector<char>으로 시작하고 누락 된 필수 기능이있는 래퍼를 구현할 것입니다.

std::vector은 일정한 시간 내에 각 요소에 액세스 할 수 있으며 std :: string (예 : Converting a vector to string)으로 쉽게 변환 할 수 있습니다.

삽입 작동이 더 중요한 경우 std::list<char>을 사용해보십시오. 주로 링크드리스트 구현입니다.

Jesper Juhl의 의견에 따르면 uint8_t을 템플릿 인수로 사용하면 실제 바이트 배열 동작을 설명 할 수 있습니다.

+0

그러나 전체 복사본을 만들지 않고 데이터를 래핑 할 수 있습니까? 그렇지 않다면 나는 그 래퍼가 어떻게 그것을 할 수 있었는지 상상할 수 없다. – Silicomancer

+0

반복자 또는 연산자 []를 사용하면 완전 복사없이 요소에 액세스 할 수 있습니다. –

+1

@ TiborTakács 그는 [** fromRawData **] (http://doc.qt.io/qt-4.8/qbytearray.html#fromRawData) 기능을 모방 할 수있는 기능을 의미합니다. – WhozCraig

2

표준은 아니지만 fromRawData을 에뮬레이트하기 위해 Guideline Support Library (결국 표준으로 이동해야 함)의 view/span 클래스를 사용할 수 있습니다.

물론 이것은 공유 된 소유권과 관련된 평생의 문제를 다루지는 않지만 귀하의 경우 충분할 수 있습니다.

또한 모든 구성 요소에 대한 요구 사항은 아니지만 GSL은 C++ 14 기반으로 광고됩니다.