如何从QVector获取QVector <t> <qvector <t>&gt;?</qvector <t> </t>

时间:2012-02-27 08:31:54

标签: qt qvector

我有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会有更多时间效用吗?

3 个答案:

答案 0 :(得分:1)

如果真的需要,那么我会做类似的事情:

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

答案 1 :(得分:0)

for (int i = 0; i < vectors.size(); ++i) {
    for(int k=0;k<vectors[i].size();k++){
        collected.push_back(vectors[i][k]);
    }
}

外循环:从向量中取出每个向量
内循环:取出第i个向量中的每个元素并推入收集的

答案 2 :(得分:0)

你可以使用Boost Multi-Array,这提供了一个多维数组。

它也只是一个标题&#39;库,因此您不需要单独编译库,只需将标题放入项目中的文件夹并包含它们。

请参阅教程和示例的链接。