我有一个QVector的QVector。我想要收集所有QVectors中的所有元素来形成一个新的QVector。
目前,我使用的代码如下
QVector<QVector<T> > vectors;
// ...
QVector<T> collected;
for (int i = 0; i < vectors.size(); ++i) {
collected += vectors[i];
}但是看起来operator+=实际上是将每个元素附加到QVector中。那么,是使用QVector更省时,还是使用更合适的类型来替代QVector
发布于 2012-02-27 16:49:18
如果你真的需要这样做(),我会这样做:
QVector< QVector<T> > vectors = QVector< QVector<T> >();
int totalSize = 0;
for (int i = 0; i < vectors.size(); ++i)
totalSize += vectors.at(i).size();
QVector<T> collected;
collected.reserve(totalSize);
for (int i = 0; i < vectors.size(); ++i)
collected << vectors[i];但请注意,这听起来有点像过早的优化。正如the documentation所指出的:
QVector试图通过预分配多达两倍于实际数据需求的内存来减少重新分配的数量。
所以不要做这样的事情,除非你真的确信它会提高你的表现。保持简单(就像你现在这样做的方式)。
编辑响应您的附加要求O(1):,如果您是随机插入,它是一个linked list,但如果您只是追加(正如您所提到的那样),您已经用QVector获得了摊销的O(1)。看看the documentation for Qt containers吧。
发布于 2012-02-27 16:37:43
for (int i = 0; i < vectors.size(); ++i) {
for(int k=0;k<vectors[i].size();k++){
collected.push_back(vectors[i][k]);
}
}外部循环:从向量中取出每个向量
内循环:取出第i个向量中的每个元素并推送到collected中
发布于 2012-02-27 18:12:19
您可以使用Boost Multi-Array,它提供了一个多维数组。
它也是一个‘头文件’库,所以你不需要单独编译一个库,只需将文件头文件放到你的项目中的一个文件夹中并包含它们即可。
请参阅教程和示例的链接。
https://stackoverflow.com/questions/9462011
复制相似问题