【问题标题】:How to get a QVector<T> from a QVector<QVector<T>>?如何从 QVector<QVector<T>> 获取 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

【问题讨论】:

    标签: qt 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,它提供了一个多维数组。

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

    查看教程和示例的链接。

    【讨论】:

    • 我会试试这个新东西,虽然这不是我想要的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多