web-dev-qa-db-ja.com

C ++でのQueue <T>のサイズの制限

同様の質問のスレッドに気づきました: 。NETのQueue <T>のサイズを制限しますか? それはまさに私がやりたいことですが、.netではなくGNU C++を使用しています。 GNU C++の基本クラスへの参照がないため、super.***()のようなJavaまたはbase.***()のような.netは機能しません。キュークラスから継承しようとしていますが、無駄になってしまいました。

やりたいこと:キューのサイズを指定し、キューがいっぱいになると自動的にデキューします。具体的には、キューの最大サイズが2の場合、3番目のアイテムをプッシュすると、新しいアイテムをプッシュする前に1番目のアイテムが自動的にポップアウトされます。

そのようなキューを実装する方法は?

ありがとう。

19
Lily

キューをカプセル化する新しいクラスを作成し、新しいクラスにサイズ制限を適用します。

13
Brian Ensink

「自動」とおっしゃっていたのは知っていますが、簡単にするために、ローカル関数にEnqueue() ingだけをカプセル化します(いいえ、クリーンなOOではありませんが、機能します)。

Queue<T> myQueue = new Queue<T>();

void addToMyQueue(T param)
{
   myQueue.Enqueue(param); //or Push(param)
   if (myQueue.Count > LIMIT)
      myQueue.Dequeue(); //or pop()
}

void main()
{
   addToMyQueue(param);
}
15
Engineer

boost :: circuclar_buffer はあなたが探していることをします:

フルバッファへの書き込み

データソースが固定サイズのバッファーに収まらないほど多くのデータを生成する場合に対処する方法には、いくつかのオプションがあります。

  1. バッファに空きができるまで待機するようにデータソースに通知します(オーバーフロー例外をスローするなど)。
  2. 最も古いデータが最も重要である場合は、バッファに再び空きができるまで、ソースからの新しいデータを無視します。
  3. 最新のデータが最も重要な場合は、最も古いデータを上書きします。
  4. バッファに書き込む前に、プロデューサーにバッファのサイズのチェックを任せます。

circular_bufferが3番目のオプションを実装していることは明らかです。しかし、他のオプション、特に最初の2つを実装していないことはあまり明白ではないかもしれません。 circular_bufferは最初の3つのオプションを実装し、それらの中から選択するメカニズムを提供する必要があるという印象を受けることができます。この印象は間違っています。 circular_bufferは、循環するように設計および最適化されています(つまり、最も古いデータがいっぱいになると上書きされます)。このような制御メカニズムが有効になっていると、問題が複雑になり、circular_bufferの使用法はおそらくそれほど単純ではなくなります。

8
Michael Burr

_Queue<T>_とは、_std::queue<T>_を意味すると仮定します。キューは、コンパイル時に渡される基になるコンテナーの単なるアダプターです。あなたはすでにあなたが望むことをしているコンテナを使うことができます。 _std::queue_に必要な操作をサポートするものを見つけることができれば、最適なのは循環バッファーのようです(Push_back()pop_front()、およびsize()、しかし私はチェックしていません)。

0
sbi