Created
May 22, 2024 19:12
-
-
Save GoodComrade/e48e2a088a380acabc8a29b230c26ce2 to your computer and use it in GitHub Desktop.
Lesta games Test task №2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Реализация 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