2012-02-27 15 views
1

私はQVectorのQVectorを持っています。そして私はすべてのQVectorのすべての要素を集めて新しいQVectorを作成したいと思います。QVectorを入手する方法<T> QVector <QVector<T>>?

現在、私はこの

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をご覧ください。

+0

以前あなたの方法を聞いたことがあります。しかし、私は** O(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番目のベクトルの各要素を取り出し、あなた本当にが、私は希望、する必要がある場合は収集

+0

あなたの答えは私と同じかもしれませんが、悪いかもしれません。しかし、同じことに感謝します。 –

0

Boost Multi-Arrayを使用できます。これは多次元配列を提供します。

ライブラリーを個別にコンパイルする必要はなく、ヘッダーをプロジェクトのフォルダーにドロップして含めるだけで、ヘッダー専用のライブラリーでもあります。

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

+0

私はこの新しいものを試してみますが、それは私が求めている答えではありません。 –

関連する問題