如何从 QVector<QVector<T>> 获取 QVector<T>?

Posted

技术标签:

【中文标题】如何从 QVector<QVector<T>> 获取 QVector<T>?【英文标题】:How to get a QVector<T> from a QVector<QVector<T>>? 【发布时间】:2012-02-27 08:31:53 【问题描述】:

我有一个 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

【问题讨论】:

【参考方案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。

【讨论】:

我以前听过你的方法。但我正在寻找一种 O(1) “连接”算法。可能是其他线性结构可以达到这个标准。【参考方案2】:
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

【讨论】:

你的答案可能和我的一样,可能更糟。不过还是谢谢你。【参考方案3】:

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

它也是一个“仅标头”库,因此您无需单独编译库,只需将标头放入项目中的文件夹并包含它们即可。

查看教程和示例的链接。

【讨论】:

我会试试这个新东西,虽然这不是我想要的答案。

以上是关于如何从 QVector<QVector<T>> 获取 QVector<T>?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 QVector<T> 的地址动态存储在另一个 QVector<QVector<T>*> 中?

返回 QVector 的最佳方式

“QVector<QVector<QVector<T>>> 向量”是啥意思?

qt5中QVector<double> 如何赋值

qvector倒序插入

初始化并访问 <QVector< QVector<int> > QT5