C ++ Создать очередь фиксированного размера - PullRequest
0 голосов
/ 28 мая 2019

В C ++ как создать простую очередь фиксированного размера ?

Я делал это несколько раз в Java и Python, но ищу способ сделать это на C ++.

Мне нужна простая очередь FIFO только с 2 элементами, чтобы использовать утилиты push и pop: я уже осознаю тот факт, что я мог реализовать свой собственный класс для выполнения такого рода ограниченийно мой ответ направлен на то, чтобы узнать, существует ли какое-либо уже доступное решение для этого.

Или, возможно, можно выполнить ту же задачу с массивом?Это бы сработало.

Заранее большое спасибо.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Использование цикличного пользовательского контейнера.Онлайн пример здесь: https://ideone.com/HZytWn

#include <array>
#include <iostream>
#include <queue>

template <typename T, size_t N = 2>
class CyclicArray {
 public:
  typedef typename std::array<T, N>::value_type value_type;
  typedef typename std::array<T, N>::reference reference;
  typedef typename std::array<T, N>::const_reference const_reference;
  typedef typename std::array<T, N>::size_type size_type;

  void push_back(const T& v) {
    if (size_ + 1 == N)
      throw;
    ++size_;
    array_[(front_ + size_) % N] = v;
  }

  void pop_front() {
    if (size_ < 1)
      throw;
    ++front_;
    --size_;
    if (front_ >= N)
      front_ = 0;
  }

  reference front() {
    return array_[front_];
  }

  size_type size() const {
    return size_;
  }

 private:
  size_type front_ = 0;
  size_type size_ = 0;
  std::array<T, N> array_;
};

int main() {
    std::queue<int, CyclicArray<int, 2>> queue;
    queue.push(1);
    int f = queue.front();
    queue.pop();
    return 0;
}
0 голосов
/ 28 мая 2019

Вы можете наследовать от очереди, а затем переопределить метод push. Вот базовый пример.

#include <queue>
#include <deque>
#include <iostream>

template <typename T, int MaxLen, typename Container=std::deque<T>>
class FixedQueue : public std::queue<T, Container> {
public:
    void push(const T& value) {
        if (this->size() == MaxLen) {
           this->c.pop_front();
        }
        std::queue<T, Container>::push(value);
    }
};

int main() {
    FixedQueue<int, 3> q;
    q.push(1);
    q.push(2);
    q.push(3);
    q.push(4);
    q.push(5);
    q.push(6);
    q.push(7);

    while (q.size() > 0)
    {
        std::cout << q.front() << std::endl;
        q.pop();
    }
}

Это напечатает

$ g++ fixedqueue.cpp -std=c++17 -o fixedqueue && ./fixedqueue
5
6
7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...