我有一个qvector的qvector。我想收集所有QVectors中的所有元素,以形成新的QVector。

目前我使用这样的代码

QVector<QVector<T> > vectors;
// ...
QVector<T> collected;
for (int i = 0; i < vectors.size(); ++i) {
     collected += vectors[i];
}
.

但似乎世代odicetagcode实际上将每个元素附加到operator+=。因此,有更多的时间效果使用生成的替代代码或更好的合适类型替换世代曲线码?

有帮助吗?

解决方案

如果你真的需要,那么我会做一些这样的事情:

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];
.

但请注意,这听起来有点像过早的优化。作为文档指向:

qvector尝试通过将最多两倍的存储器作为实际数据需求来减少重新分配的数量。

所以不要做这种事情,除非你真的确定它会提高你的表现。保持简单(就像你当前的做法)。

编辑响应您的o(1)的其他要求: 好吧,如果你随机插入它是一个链接列表但如果你只是附加(因为你所提到的那样)你已经用qvector获得了摊销o(1)。看看 qt容器的文档

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top