БлогNot. QT: делаем кольцевой буфер

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 просмотр]


теги: c++ список qt алгоритм

К этой статье пока нет комментариев, Ваш будет первым