Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QByteArray的标准更换件_C++_Qt_C++11_Qbytearray - Fatal编程技术网

C++ QByteArray的标准更换件

C++ QByteArray的标准更换件,c++,qt,c++11,qbytearray,C++,Qt,C++11,Qbytearray,我想将QtC++11函数移植到标准C++11。该函数有一个QByteArray参数,该参数接受任何类型的数据(文本、二进制数据等),并根据数据计算哈希值 QByteArray似乎非常适合,因为它可以携带任何类型的数据,并具有许多函数,允许从流、设备、字符串等填充数据。它甚至可以使用fromRawData()包装数据,而无需进行深度复制。 有没有提供类似灵活性的标准C++11解决方案?目前,我倾向于使用好的旧void*plus size.我不知道这种标准容器具有与QByteArray相同的复杂功能

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

QByteArray
似乎非常适合,因为它可以携带任何类型的数据,并具有许多函数,允许从流、设备、字符串等填充数据。它甚至可以使用
fromRawData()包装数据,而无需进行深度复制。


有没有提供类似灵活性的标准C++11解决方案?目前,我倾向于使用好的旧
void*
plus size.

我不知道这种标准容器具有与QByteArray相同的复杂功能,但我将从
std::vector
开始,并将围绕其实现一个包装器,其中包含缺少的和必要的功能

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

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


根据Jesper Juhl的评论:使用
uint8\t
作为模板参数将描述字节数组的实际行为。

不太标准,但您可以使用中的类(最终将移动到标准中)来模拟
fromRawData

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

此外,虽然并非所有组件都需要GSL,但GSL被宣传为基于C++14

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

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

几乎任何字符都可以存储(无符号)字符数组。@Silicomancer如果不需要深度副本,请使用指针和大小。你已经有了。大多数标准库操作都在迭代器范围内工作,因此传递
ptr,ptr+size
作为范围是非常常见的。更直接地说,QByteArray所提供的功能的广度远比不上任何东西。大多数情况下都需要您实现该行为。@RawN。。。在范围内复制值。OP提到的具体方法是,除非遇到严重的std::allocator重载(坦率地说,不值得这么麻烦),否则没有任何类似的方法可以通过vector使用在我看来,
std::vector
显然是
QByteArray
的替代品,如果您只想要一个可以容纳任意二进制数据的容器..希望我们能得到
std::array\u视图
,在这种情况下,它会很好地工作。现在,我认为您可以将其作为核心指南库的一部分来获取。但它是否支持在不进行深度复制的情况下包装数据?如果没有,我无法想象这样的包装器是如何做到的。使用迭代器或运算符[],您可以访问元素而无需深度复制。@TiborTakács他指的是模拟功能的能力。这不是一个非常通用的用例,但使用特殊的分配器对象,理论上您可以做到这一点
char
对于向量来说是一个不好的模板参数,因为您不知道它在实现中是有符号的还是无符号的(C++中有3种字符类型:<代码> char < />代码>代码>未签名char < />代码>代码>符号char < />代码,它们与类型系统不同。
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));
}