Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save GoodComrade/e48e2a088a380acabc8a29b230c26ce2 to your computer and use it in GitHub Desktop.
Save GoodComrade/e48e2a088a380acabc8a29b230c26ce2 to your computer and use it in GitHub Desktop.
Lesta games Test task №2
Реализация 1: Циклический буфер на основе массива
#include <iostream>
template <typename T, std::size_t Size>
class CircularBufferArray {
private:
T buffer[Size];
std::size_t head = 0;
std::size_t tail = 0;
bool full = false;
public:
void put(T item) {
buffer[head] = item;
if (full) {
tail = (tail + 1) % Size;
}
head = (head + 1) % Size;
full = head == tail;
}
T get() {
if (empty()) {
throw std::runtime_error("Buffer is empty");
}
T item = buffer[tail];
full = false;
tail = (tail + 1) % Size;
return item;
}
bool empty() const {
return (!full && (head == tail));
}
bool isFull() const {
return full;
}
std::size_t capacity() const {
return Size;
}
std::size_t size() const {
std::size_t size = Size;
if (!full) {
if (head >= tail) {
size = head - tail;
} else {
size = Size + head - tail;
}
}
return size;
}
};
Плюсы:
1. Простота и эффективность: Массивы имеют фиксированный размер и обеспечивают быстрый доступ к элементам.
2. Нет дополнительного выделения памяти: Все элементы выделяются сразу при создании буфера,
что может быть выгодно для систем с ограниченной памятью и требований реального времени.
Минусы:
1. Фиксированный размер: Невозможность изменения размера буфера после создания.
Если буфер заполняется полностью, старые данные теряются.
2. Память используется статически: Может быть неоптимально, если буфер используется не полностью, а размер выбран с запасом.
Реализация 2: Циклический буфер на основе std::vector
#include <iostream>
#include <vector>
template <typename T>
class CircularBufferVector {
private:
std::vector<T> buffer;
std::size_t head = 0;
std::size_t tail = 0;
bool full = false;
public:
CircularBufferVector(std::size_t size) : buffer(size) {}
void put(T item) {
buffer[head] = item;
if (full) {
tail = (tail + 1) % buffer.size();
}
head = (head + 1) % buffer.size();
full = head == tail;
}
T get() {
if (empty()) {
throw std::runtime_error("Buffer is empty");
}
T item = buffer[tail];
full = false;
tail = (tail + 1) % buffer.size();
return item;
}
bool empty() const {
return (!full && (head == tail));
}
bool isFull() const {
return full;
}
std::size_t capacity() const {
return buffer.size();
}
std::size_t size() const {
std::size_t size = buffer.size();
if (!full) {
if (head >= tail) {
size = head - tail;
} else {
size = buffer.size() + head - tail;
}
}
return size;
}
};
Плюсы:
1. Гибкость: Возможность динамически изменять размер буфера при необходимости, если использовать методы std::vector::resize().
2. Современные возможности C++: Использование STL контейнеров, что упрощает работу с буфером и уменьшает риск ошибок,
связанных с ручным управлением памятью.
Минусы:
1. Дополнительные накладные расходы: Использование std::vector может добавить некоторую накладную по времени и памяти
из-за динамического управления памятью и хранения дополнительных метаданных.
2. Не всегда оптимально по производительности: В некоторых системах использование динамической памяти может быть
менее эффективным по сравнению с статически выделенными массивами.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment