我想將Qt C++ 11函數移植到標準C++ 11。該函數有一個QByteArray
參數,該參數接受任何類型的數據(文本,二進制數據等)並根據數據計算散列值。QByteArray的標準替換
QByteArray
似乎很適合,因爲它可以攜帶任何類型的數據,有很多的是允許從流,設備,字符串等填充它甚至可以換的數據沒有做使用fromRawData()
深拷貝功能。
是否有標準的C++ 11解決方案提供類似的靈活性?目前我傾向於使用好舊的void*
加上大小。
我想將Qt C++ 11函數移植到標準C++ 11。該函數有一個QByteArray
參數,該參數接受任何類型的數據(文本,二進制數據等)並根據數據計算散列值。QByteArray的標準替換
QByteArray
似乎很適合,因爲它可以攜帶任何類型的數據,有很多的是允許從流,設備,字符串等填充它甚至可以換的數據沒有做使用fromRawData()
深拷貝功能。
是否有標準的C++ 11解決方案提供類似的靈活性?目前我傾向於使用好舊的void*
加上大小。
是否有標準的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));
}
我不知道具有與QByteArray相同的複雜功能的標準容器,但我會以std::vector<char>
開頭,並且會實施一個包含缺失和必要功能的包裝。
std::vector
具有很高的靈活性,您可以訪問在固定時間內的每個元素,你可以很容易地將其轉換爲的std :: string(例如Converting a vector to string)。
如果插入操作更重要,也許你可以嘗試std::list<char>
。主要是這個鏈表實現。
根據Jesper Juhl的評論:使用uint8_t
作爲模板參數會描述真實的字節數組的行爲。
但它是否支持在不進行深度複製的情況下封裝數據?如果不是,我無法想象這樣的包裝可以做到這一點。 – Silicomancer
使用迭代器或使用operator [],您可以在不進行深度複製的情況下訪問該元素。 –
@TiborTakács他意思是模仿[** fromRawData **](http://doc.qt.io/qt-4.8/qbytearray.html#fromRawData)功能的能力。 – WhozCraig
不太標準,但你可以使用Guideline Support Library的view
/span
類(它最終應該移到標準中)來模擬fromRawData
。
當然,這不涉及與共享所有權相關的生命週期問題,但在您的情況下可能已足夠。
此外,雖然它可能不是所有組件的要求,但GSL通告爲基於C++ 14。
幾乎任何[STL容器](http://en.cppreference.com/w/cpp/container)都可以存儲(無符號)字符數組。 – 2016-11-23 21:46:26
@Raw N:如何在不進行深度複製的情況下從指針和大小(或者C字符串)初始化'vector'? –
Silicomancer
'myVector.assign(指針,指針+大小)'也許?還有大約7個[不同的構造函數](http://en.cppreference.com/w/cpp/container/vector/vector)。 – 2016-11-23 21:55:16