/
Daniil_ar
/
PatternRecognitionMethodsD
Обзор
Документация
Войти
/
Daniil_ar
/
PatternRecognitionMethodsD
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
cpp_classes/container.h
96 строк
3 KB
stason trqvella
image_container
24 сен 2025, 21:47
24 сен 2025, 21:47
e3bf395
Код
Авторство
О чём код?
#include "image.h" #include <stdexcept> #include <vector> #include <iterator> // Этот класс отвечает за работу с выделенной памятью // в классе Image template <typename T> class Container { public: Container() = default; explicit Container(size_t capacity) : img_(capacity) { init_idx_.reserve(capacity); } // Добавляет элемент в конец контейнера void AddBack(T val) { if (img_.GetCapacity() > size_) { int index = std::distance(img_.GetAddress(), img_.GetAddress() + size_); init_idx_.push_back(index); *(img_.GetAddress() + size_) = val; size_++; return; } throw std::out_of_range("Container is full"); } // Удалить последний элемент void PopBack() { if (size_ > 0) { int index = std::distance(img_.GetAddress(), img_.GetAddress() + size_); init_idx_.erase(index); *(img_.GetAddress() + size_) = nullptr; size_--; return; } throw std::out_of_range("Container is empty"); } // Добавить элемент по индексу // Индекс должен быть в интервале от 0 до n-1 void AddByIndex(size_t ind, T val) { if (img_.GetCapacity() > size_) { int index = std::distance(img_.GetAddress(), img_.GetAddress() + ind); init_idx_.push_back(index); *(img_.GetAddress() + ind) = val; size_++; return; } throw std::out_of_range("Container is full"); } // Удалить элемент по индексу // Индекс должен быть в интервале от 0 до n-1 void PopByIndex(size_t ind) { if (size_ > 0) { int index = std::distance(img_.GetAddress(), img_.GetAddress() + ind); init_idx_.erase(index); *(img_.GetAddress() + ind) = nullptr; size_--; return; } throw std::out_of_range("Container is empty"); } const std::vector<T> GetInitializedValues() const { std::vector<T> result; for(auto it = init_idx_.begin(); it != init_idx_.end(); it++){ result.push_back(*(img_.GetAddress() + *it)); } return result; } // Получить кусок выделенной памяти //(с инициализированными и нет значениями) const T *GetWholeChunk() const { return img_.GetAddress(); } const size_t GetCapacity()const{ return img_.GetCapacity(); } private: Image<T> img_; size_t size_ = 0; std::vector<int> init_idx_; };