Ответ 1
Создайте новый класс, который инкапсулирует очередь и обеспечит ограничение размера в новом классе.
Я замечаю нить аналогичного вопроса: Предельный размер очереди <T> в .NET?
Это именно то, что я хочу сделать, но я не использую .net, но GNU С++. У меня нет ссылки на базовый класс в GNU С++, поэтому java вроде super.***()
или .net like base.***()
не будет работать. Я пытаюсь наследовать класс очереди, но получается тщетно.
Что я хочу сделать: указать размер очереди и автоматически деактивировать, когда очередь заполнена. Чтобы быть конкретным: если максимальный размер моей очереди равен 2, когда я нажимаю третий элемент, первый элемент будет автоматически выскользнут, прежде чем нажимать новый элемент.
Как реализовать такую очередь?
Спасибо.
Создайте новый класс, который инкапсулирует очередь и обеспечит ограничение размера в новом классе.
Я знаю, что вы сказали "автоматический", но, чтобы все было просто: инкапсулируйте только 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);
}
Похоже, boost:: circuclar_buffer делает то, что вы ищете:
Запись в полный буфер
Существует несколько вариантов того, как справляться с случаем, если источник данных дает больше данных, чем может буфер фиксированного размера:
- Сообщите источнику данных, чтобы он дождался в буфере есть место (например, бросая исключение переполнения).
- Если самые старые данные являются наиболее важно, игнорировать новые данные из источника до тех пор, пока в буфер снова.
- Если последние данные являются наиболее важными, напишите самые старые данные.
- Пусть продюсер будет ответственный за проверку размера буфер, предварительно записывающий в него.
Очевидно, что
circular_buffer
реализует третий вариант. Но это может быть менее очевидно не реализует другой вариант - особенно первые два. Можно получить создается впечатление, чтоcircular_buffer
должен реализовывать первых трех вариантов и механизм выбора среди них. Эта впечатление неправильное.circular_buffer
был разработан и оптимизирован для кругового движения (что означает перезапись самых старых данных, когда полный). Если такой механизм управления был включен, это было бы просто усложняют вопросы и используют изcircular_buffer
будет вероятно, менее прямолинейный.
Предполагая, что в Queue<T>
вы имеете в виду std::queue<T>
: очередь - это всего лишь адаптер для некоторого базового контейнера, который передавался во время компиляции. Вы можете использовать контейнер, который уже делает то, что вы хотите. Лучше всего подходит циклический буфер, если вы можете найти тот, который поддерживает операции, необходимые для std::queue
(я думаю, что push_back()
, pop_front()
и size()
, но я не проверял).