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:
- Informe al origen de datos que espere hasta que haya espacio en el búfer (por ejemplo, lanzando una excepción de desbordamiento).
- 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.
- Si los datos más recientes son los más importantes, escriba sobre los datos más antiguos.
- 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 quecircular_buffer
debería implementar las tres primeras opciones y ofrecer un mecanismo para elegir entre ellas. Esta impresión es incorrecta. Elcircular_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 decircular_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).