QVector
std::vector
名前から推測できるように、ほとんどはに類似しています。 QList
とboost::ptr_deque
の明らかな関連にもかかわらず、に近いstd::list
です。オブジェクトを直接格納するのではなく、オブジェクトへのポインタを格納します。両端での迅速な挿入のすべての利点が得られ、再割り当てにはコピーコンストラクターの代わりにポインターのシャッフルが含まれますが、実際のstd::deque
またはの空間的な局所性が失われ、std::vector
多くのヒープ割り当てが得られます。小さなオブジェクトへのヒープ割り当てを回避し、空間的な局所性を取り戻すための意思決定はありますが、私が理解していることから、それはint
。よりも小さいものにのみ適用されます。
QLinkedList
に類似しstd::list
ており、すべての欠点があります。一般的に言って、これがコンテナの最後の選択になるはずです。
QTライブラリはQList
オブジェクトの使用を大いに支持しているため、独自のコードでオブジェクトを支持することで、不必要な面倒な作業を回避できる場合があります。余分なヒープの使用と実際のデータのランダムな配置は、状況によっては理論的には害を及ぼす可能性がありますが、見過ごされがちです。したがってQList
、プロファイリングがに変更することを提案するまで使用することをお勧めしQVector
ます。連続した割り当てが重要であると予想される場合[読んでください:のT[]
代わりにを期待するコードとインターフェースしているQList<T>
]、それはまた、QVector
すぐに始める理由になる可能性があります。
コンテナ全般について質問していて、QTドキュメントを参照として使用しただけの場合、上記の情報はあまり役に立ちません。
Anstd::vector
は、サイズを変更できる配列です。すべての要素が隣り合って保存されており、個々の要素にすばやくアクセスできます。欠点は、挿入が一方の端でのみ効率的であるということです。何かを途中または最初に置く場合は、他のオブジェクトをコピーしてスペースを空ける必要があります。big-oh表記では、最後の挿入はO(1)、他の場所への挿入はO(N)、ランダムアクセスはO(1)です。
Anstd::deque
も同様ですが、オブジェクトが隣り合って格納されることを保証せず、両端にO(1)を挿入できます。また、一度に割り当てるメモリのチャンクを小さくする必要がありますが、これは重要な場合があります。ランダムアクセスはO(1)で、中央への挿入はO(N)で、vector
。と同じです。空間的な局所性はより悪いですがstd::vector
、オブジェクトはクラスター化される傾向があるため、いくつかの利点があります。
アンは、std::list
リンクリストです。3つの標準シーケンシャルコンテナの中で最もメモリのオーバーヘッドが必要ですが、どこにでも高速に挿入できます...挿入する必要がある場所が事前にわかっている場合に限ります。個々の要素へのランダムアクセスは提供されないため、O(N)で繰り返す必要があります。しかし、そこに入ると、実際の挿入はO(1)です。の最大の利点std::list
は、それらをすばやくつなぎ合わせることができることです...値の範囲全体を別の値に移動するとstd::list
、操作全体がO(1)になります。また、リストへの参照を無効にすることははるかに困難であり、これは重要な場合があります。
一般的なルールとして、私が好むstd::deque
にstd::vector
、私は生の配列を期待ライブラリにデータを渡すことができるようにする必要がありますしない限り、。 std::vector
連続性が保証されて&v[0]
いるため、この目的で機能します。前回使用したのは覚えていませんstd::list
が、参照が有効なままであるというより強力な保証が必要だったためです。