while usando numero funciones fuente for ejemplos declaracion con codigos codigo basicos c++ queue limit containers

usando - factorial de un numero en c++ con while



Tamaño límite de la cola<T> en C++ (4)

Cree una nueva clase que encapsule la cola y aplique un límite de tamaño en la nueva clase.

Noté el hilo de una pregunta similar: ¿ Limitar el tamaño de la Cola <T> en .NET? Eso es exactamente lo que quiero hacer, pero no estoy usando .net sino GNU C ++. No tengo ninguna referencia a la clase base en GNU C ++, por lo que java como super.***() o .net como base.***() no funcionará. He estado tratando de heredar de la clase de cola pero resulta en vano.

Lo que quiero hacer: especifique el tamaño de la cola, y se retirará automáticamente de la cola cuando la cola esté llena. Para ser específico: si el tamaño máximo de mi cola es 2, cuando empujo el tercer elemento, el primer elemento se abrirá automáticamente antes de presionar el nuevo elemento.

¿Cómo implementar tal cola?

Gracias.


Sé que usted dijo "automático", pero, para mantener las cosas simples: encapsule solo la entrada en Enqueue() en una función local (no, no OO limpio, pero funciona):

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); }


Suena como boost::circuclar_buffer hace lo que estás buscando:

Escribiendo a un búfer completo

Hay varias opciones para enfrentar el caso si una fuente de datos produce más datos de los que caben en el búfer de tamaño fijo:

  1. Informe al origen de datos que espere hasta que haya espacio en el búfer (por ejemplo, lanzando una excepción de desbordamiento).
  2. Si los datos más antiguos son los más importantes, ignore los nuevos datos de la fuente hasta que haya espacio en el búfer nuevamente.
  3. Si los datos más recientes son los más importantes, escriba sobre los datos más antiguos.
  4. Deje que el productor sea responsable de verificar el tamaño del búfer antes de escribir en él.

Es evidente que el circular_buffer implementa la tercera opción. Pero puede ser menos evidente que no implementa ninguna otra opción, especialmente las dos primeras. Uno puede tener la impresión de que circular_buffer debería implementar las tres primeras opciones y ofrecer un mecanismo para elegir entre ellas. Esta impresión es incorrecta. El circular_buffer fue diseñado y optimizado para ser circular (lo que significa sobrescribir los datos más antiguos cuando están completos). Si tal mecanismo de control hubiera sido habilitado, solo complicaría las cosas y el uso de circular_buffer sería probablemente menos directo.


Suponiendo que por Queue<T> te refieres a std::queue<T> : una cola es solo un adaptador para un contenedor subyacente que se pasa en tiempo de compilación. Podrías usar un contenedor que ya hace lo que quieres. El mejor ajuste parece ser un búfer circular, si puede encontrar uno que admita las operaciones necesarias para std::queue (creo que es push_back() , pop_front() y size() , pero no lo he comprobado).