注:多くの言語でqueue
は単なるインターフェイスであり、実装については何も言及していません。
リングバッファa.k.a、アレイベースの循環キューを使用して、あなたは完全なバッファにプッシュする状況に対処しなければなりません。あなたは可能性:
- はスペースが
- (再)メモリを割り当てて、すべてのコンテンツ
- は特大のバッファを使用してコピーするので、このような状況もありますまで挿入
- が
- ブロックを最も古いエントリを上書き無視これらの各オプション欠点を持っている
起こることはありません。彼らと一緒に暮らすことができたり、バッファをいっぱいにしないことが分かっている場合は、リングバッファーを使用してください。
オプション3 & 4は、吃音を誘導します。あなたのユースケースによっては、より長くても安定したアクセス時間と信頼性が望ましく、がを超える場合はとなります。linked list
などの動的実装を選択すると、deque
のようになります。
使用例の例のように、あなたは安定したフレーム/サンプリングレートやスループットを達成するために持っていて、吃音を容認することはできませんタスク、以下のとおりです。
- リアルタイムのビデオとオーディオ処理
- リアルタイム
をレンダリングあなたが新しい仕事を押したときにスレッドが長すぎるためにブロックしたくないとき
- スレッド・プールをネットワーク
- 。
ただし、リニアアレイをベースにしたキューには同じような欠点があります。私は循環キュー上でリニアキューを選択する理由は見ません。 (やや高い実施の複雑さに加えて)
std::queue
C++では、デフォルトで下地コンテナとしてdeque
を使用します。 deque
は本質的に、小さなチャンクでメモリを割り当てて吃音を起こさないため、ほとんどのユースケースで良い基盤のように見える配列の動的配列です。
循環キューは、すべての状況で「明らかに良い」わけではありません。特に、無制限のキューが必要な場合は、アイテムの数が事前割り当てサイズを超えたときに再割り当てする必要があり、配列の先頭に未使用のスペースがあるため、ひどい選択ですアイテムの数が減少します。リンクされたリストは、無制限のキューを実装するもっと良い方法です。 –
この場合、配列の実装が使用されているため、両方がバインドされています。 – david419