QT: делаем кольцевой буфер
В библиотеке Tulip, как и в stl, есть практически все нужные контейнеры для реализации типовых динамических структур данных. Конечно, иногда приходится изменять или расширять функционал контейнера, и самый естественный путь сделать это - написать класс-потомок, модифицирующий или дополняющий базовый функционал класса-родителя.
В качестве примера сделаем из стандартной очереди QQueue
кольцевой буфер CQueue
, отличающийся тем, что ёмкость очереди ограничена заданным натуральным значением count
. Если при добавлении элементов предельная ёмкость превышена, из буфера удаляется самый старый элемент.
Чтобы решение было достаточно универсальным, реализуем шаблон класса CQueue
, полный исходник с комментариями - ниже:
#include <QCoreApplication> #include <QQueue> #include <QDebug> #include <iostream> using namespace std; //Кольцевой буфер на основе стандартной очереди template <class T> class CQueue : public QQueue <T> { //как наследоваться от стандартного контейнера //для любого типа данных T private: int count; //предельный размер public: inline CQueue (int cnt) : QQueue<T>(),count(cnt) { //конструктор } inline void enqueue (const T &t) { //перегрузка метода постановки в очередь if (count==QQueue<T>::count()) { QQueue<T>::dequeue(); //удалить старейший элемент по заполнении } QQueue<T>::enqueue(t); } }; int main() { const int size=5; //размер буфера CQueue <int> q(size); for (int i=0; i<2*size; i++) q.enqueue(i+1); //заносим в буфер вдвое больше элементов, //чем он вмещает qDebug() << "Size=" << q.size(); for (int i=0; i<size; i++) qDebug() << q.dequeue(); //осталась только последняя половина элементов cin.sync(); cin.get(); return 0; }
Как видно из кода, нам пришлось модифицировать только конструктор и метод постановки в очередь родительского класса.
25.03.2016, 14:40 [8741 просмотр]