1

QVectorのQVectorがあります。そして、すべてのQVectorのすべての要素を収集して、新しいQVectorを形成したいと思います。

現在、私はこのようなコードを使用しています

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

しかし、operator+=実際には各要素をに追加しているようQVectorです。それで、より時間効率QVectorの良い使用法またはより適切なタイプの代替品はありQVectorますか?

4

3 に答える 3

2

あなたが本当にする必要があるなら、私は次のようなことをします:

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は、実際のデータが必要とする最大2倍のメモリを事前に割り当てることにより、再割り当ての数を削減しようとします。

したがって、パフォーマンスが向上することが本当に確実でない限り、この種のことを行わないでください。シンプルに保ちます(現在のやり方のように)。

O(1)の追加要件に応じて編集し ます。ランダムに挿入する場合はリンクリストですが、追加するだけの場合(これですべてです)、すでに償却済みのO(1)があります。 QVectorを使用します。Qtコンテナのドキュメントをご覧ください。

于 2012-02-27T08:49:17.873 に答える
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番目のベクトルの各要素を取り出して収集されたものにプッシュします

于 2012-02-27T08:37:43.260 に答える
0

Boost Multi-Arrayを使用できます。これにより、多次元配列が提供されます。

これは「ヘッダーのみ」のライブラリでもあるため、ライブラリを個別にコンパイルする必要はありません。ヘッダーをプロジェクトのフォルダーにドロップして含めるだけです。

チュートリアルと例については、リンクを参照してください。

于 2012-02-27T10:12:19.400 に答える