2016-11-23 79 views
3

我想將Qt C++ 11函數移植到標準C++ 11。該函數有一個QByteArray參數,該參數接受任何類型的數據(文本,二進制數據等)並根據數據計算散列值。QByteArray的標準替換

QByteArray似乎很適合,因爲它可以攜帶任何類型的數據,有很多的是允許從流,設備,字符串等填充它甚至可以換的數據沒有做使用fromRawData()深拷貝功能。

是否有標準的C++ 11解決方案提供類似的靈活性?目前我傾向於使用好舊的void*加上大小。

+0

幾乎任何[STL容器](http://en.cppreference.com/w/cpp/container)都可以存儲(無符號)字符數組。 – 2016-11-23 21:46:26

+0

@Raw N:如何在不進行深度複製的情況下從指針和大小(或者C字符串)初始化'vector '? – Silicomancer

+0

'myVector.assign(指針,指針+大小)'也許?還有大約7個[不同的構造函數](http://en.cppreference.com/w/cpp/container/vector/vector)。 – 2016-11-23 21:55:16

回答

3

是否有標準的C++ 11解決方案提供類似的靈活性?目前我傾向於使用良好的舊void * plus大小。

沒有標準的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

使用迭代器或使用operator [],您可以在不進行深度複製的情況下訪問該元素。 –

+1

@TiborTakács他意思是模仿[** fromRawData **](http://doc.qt.io/qt-4.8/qbytearray.html#fromRawData)功能的能力。 – WhozCraig

2

不太標準,但你可以使用Guideline Support Libraryview/span類(它最終應該移到標準中)來模擬fromRawData

當然,這不涉及與共享所有權相關的生命週期問題,但在您的情況下可能已足夠。

此外,雖然它可能不是所有組件的要求,但GSL通告爲基於C++ 14。