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