無数の答えがあるので、混乱するかもしれませんが、要約すると:
を使用しstd::queue
ます。これの理由は簡単です:それはFIFO構造です。FIFOが必要な場合は、std::queue
。
それはあなたの意図を他の誰にも、そしてあなた自身にも明らかにします。A std::list
またはstd::deque
しません。リストは、FIFO構造では想定されていない場所に挿入および削除deque
できます。また、FIFO構造では実行できない、両端から追加および削除できます。
このため、を使用する必要がありqueue
ます。
今、あなたはパフォーマンスについて尋ねました。まず、この重要な経験則を常に覚えておいてください:最初に良いコード、最後にパフォーマンス。
これの理由は単純です。清潔さと優雅さの前にパフォーマンスを追求する人は、ほとんどの場合最後に終了します。彼らは本当に何もないようにするために良いことをすべて放棄しているので、彼らのコードはドロドロになります。
最初に適切で読みやすいコードを書くことで、パフォーマンスの問題のほとんどは自動的に解決されます。そして、後でパフォーマンスが不足していることがわかった場合は、プロファイラーをきれいなコードに追加して、問題がどこにあるかを簡単に見つけることができます。
とstd::queue
はいえ、アダプターにすぎません。安全なインターフェースを提供しますが、内部では別のコンテナーを使用します。この基礎となるコンテナーを選択できます。これにより、かなりの柔軟性が得られます。
それで、どの基本的なコンテナを使うべきですか?我々はことを知っているstd::list
とstd::deque
の両方が必要な機能を提供(push_back()
、pop_front()
、およびfront()
)、私たちはどのように決めるのですか?
まず、メモリの割り当て(および割り当て解除)は、OSに行って何かをするように要求することを伴うため、一般的に、迅速に行うことではないことを理解してください。A list
は、何かが追加されるたびにメモリを割り当て、それがなくなったら割り当てを解除する必要があります。
Aはdeque
、他の一方で、チャンクで割り振ります。割り当て頻度が低くなりlist
ます。リストと考えてください。ただし、各メモリチャンクは複数のノードを保持できます。(もちろん、実際にどのように機能するかを学ぶことをお勧めします。)
したがって、それだけでdeque
は、メモリを頻繁に処理しないため、aの方がパフォーマンスが向上します。一定サイズのデータを処理しているという事実と混じり合って、おそらくデータの最初のパスの後で割り当てを行う必要はありませんが、リストは常に割り当てと割り当て解除を行います。
理解する必要がある2番目の事項は、キャッシュのパフォーマンスです。RAMへのアクセスは遅いため、CPUが本当に必要な場合は、メモリのチャンクをキャッシュに戻すことで、この時間を最大限に活用します。deque
はメモリチャンクに割り当てられるため、このコンテナ内の要素にアクセスすると、CPUが残りのコンテナも戻す可能性があります。これでdeque
、データがキャッシュにあるため、への以降のアクセスはすべて高速になります。
これは、データが一度に1つずつ割り当てられるリストとは異なります。これは、データがメモリ内のあらゆる場所に分散する可能性があり、キャッシュのパフォーマンスが低下することを意味します。
したがって、それを考慮すると、a deque
の方が適しています。これが、を使用する場合のデフォルトのコンテナである理由ですqueue
。とは言っても、これはまだ(非常に)教育を受けた推測にすぎません。あるコードdeque
とlist
他のテストを使用して、このコードをプロファイリングし、確実に知る必要があります。
しかし、覚えておいてください。コードをクリーンなインターフェースで動作させてから、パフォーマンスについて心配してください。
ジョンは、list
またはをラップするdeque
とパフォーマンスが低下するという懸念を提起します。もう一度言いますが、彼も私も自分でプロファイリングせずに確実に言うことはできませんが、コンパイラが行う呼び出しをインライン化する可能性がありqueue
ます。つまり、と言うとqueue.push()
、実際にはとだけ言っqueue.container.push_back()
て、関数呼び出しを完全にスキップします。
繰り返しになりますが、これはqueue
経験に基づく推測にすぎませんが、基になるコンテナーrawを使用する場合と比較すると、a を使用してもパフォーマンスは低下しません。前に言ったように、を使用してくださいqueue
。これは、クリーンで使いやすく、安全であり、本当に問題のあるプロファイルとテストになる場合に使用します。