我想将Qt C ++ 11函数移植到标准C ++ 11。该函数有一个QByteArray
参数,可以接受任何类型的数据(文本,二进制数据等)并根据数据计算哈希值。
QByteArray
似乎非常适合,因为它可以携带任何类型的数据,并且具有许多功能,允许从流,设备,字符串等填充它。它甚至可以包装数据而不需要深入使用fromRawData()
进行复制。
是否有标准的C ++ 11解决方案提供类似的灵活性?目前我倾向于使用好的void*
加上大小。
答案 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。