gpt4 book ai didi

c++ - QByteArray 的标准替代品

转载 作者:太空狗 更新时间:2023-10-29 20:02:27 28 4
gpt4 key购买 nike

我想将 Qt C++11 函数移植到标准 C++11。该函数有一个 QByteArray 参数,它接受任何类型的数据(文本、二进制数据等)并根据数据计算哈希值。

QByteArray 似乎很适合,因为它可以携带任何类型的数据,并且有很多功能可以从流、设备、字符串等中填充它。它甚至可以在不包装数据的情况下包装数据使用 fromRawData() 进行深度复制。

是否有提供类似灵 active 的标准 C++11 解决方案?目前我倾向于使用旧的 void* 加号。

最佳答案

Is there a standard C++11 solution that provides similar flexibility? Currently I tend to use good old void* plus size.

没有标准的 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));
}

关于c++ - QByteArray 的标准替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40774637/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com