QByteArray的标准替代品

时间:2016-11-23 21:44:23

标签: c++ qt c++11 qbytearray

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

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

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

3 个答案:

答案 0 :(得分:3)

我不知道这种具有与QByteArray相同的复杂功能的标准容器,但我会从 // The constructor logic remains the same // .... renderLoadingView() { return ( <View style={[styles.cardContainer, styles.loading]}> <Text style={styles.restData}> Loading ... </Text> </View> ) } _buttonPress = () => { this.props.navigator.push({ id: 'Main' }) } renderGPSDataFromServer =() => { const {loaded} = this.state; const {state} = this.state; return this.state.dataArr.map((data, i) => { return( <View style={[styles.cardContainer, styles.modularBorder, styles.basePadding]} key={i}> <View style={styles.cardContentLeft}> <TouchableHighlight style={styles.button} onPress={this._buttonPress}> <Text style={styles.restData}>View Video</Text> </TouchableHighlight> </View> <View style={styles.cardContentRight}> <Text style={styles.restData}>{i}</Text> <View style={styles.gpsDataContainer}> <Text style={styles.gpsData}> {Number(data.lat).toFixed(2)}</Text> <Text style={styles.gpsData}>{Number(data.long).toFixed(2)}</Text> </View> <Text style={styles.gpsData}> {this.calcRow(55,55).bind(this)} </Text> </View> </View> ); }); } render = ()=> { if (!this.state.loaded) { return this.renderLoadingView(); } return( <View> {this.renderGPSDataFromServer()} </View> ) }}; 开始,并使用缺少的和必要的函数来实现它的包装。

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

如果 insert 操作更重要,您可以尝试std::vector。主要是链表实现。

基于Jesper Juhl的评论:使用std::list< char >作为模板参数将描述真实的字节数组行为。

答案 1 :(得分:3)

  

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

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

如果许可条款允许,您只需复制QByteArray(它是一些文件)并将其与您的项目捆绑在一起。

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

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));
}

答案 2 :(得分:2)

不太标准,但您可以使用view/span中的Guideline Support Library类(最终应该转移到标准中)来模拟fromRawData

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

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