首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QByteArray标准替换

QByteArray标准替换
EN

Stack Overflow用户
提问于 2016-11-23 21:44:22
回答 3查看 2.6K关注 0票数 4

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

fromRawData()**.**看起来非常适合,因为它可以携带任何类型的数据,并且具有许多功能,允许从流、设备、字符串等填充数据。甚至可以在不使用进行深度复制的情况下包装数据。

是否有提供类似灵活性的标准C++11解决方案?目前,我倾向于使用好的老void*加大小。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-23 22:36:43

是否有提供类似灵活性的标准C++11解决方案?目前,我倾向于使用好的旧的空*加大小。

没有标准的C++11解决方案可以提供既可以管理自己的内存,也可以包装由其他人管理的内存的容器。

如果许可条款允许,您可以简单地复制QByteArray (它是几个文件)并将其与您的项目捆绑在一起。

否则,如果您只打算为所有元素处理具有连续存储的容器,那么const void*size_t参数将是非常有意义的,并且将是最可移植的和适应性最强的。您可以根据需要提供方便的重载。例如。

代码语言:javascript
复制
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可以选择一个范围,并为散列整个容器提供过载。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-11-23 21:50:47

我不知道这样的标准容器,它具有与QByteArray相同的复杂功能,但我将从std::vector< char >开始,用缺少的和必要的函数实现包装器。

std::vector具有很高的灵活性,您可以在固定时间内访问每个元素,并且可以轻松地将其转换为std::string (例如,将向量转换为字符串)。

如果插入操作更重要,也许可以尝试std::list< char >。这主要是链表实现。

根据Jesper的注释:使用uint8_t作为模板参数将描述真正的字节数组行为。

票数 3
EN

Stack Overflow用户

发布于 2016-11-23 22:06:03

虽然不太标准,但您可以使用来自span指南支持图书馆类(最终会转移到标准中)来模拟fromRawData

当然,这并不涉及与共享所有权相关的生存期问题,但在您的情况下可能就足够了。

此外,虽然它可能不是所有组件的需求,但GSL被宣传为基于C++14的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40774637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档