Container<T>
Database<T>
Освоить разработку шаблонных классов, работу с динамической памятью и применение стандартных алгоритмов STL.
Разрешено использование алгоритмов STL (std::sort, std::find, std::copy_if и др.),
но запрещено использование контейнеров STL (vector, list и т.д.).
Container<T>Реализуйте шаблонный класс-контейнер для хранения набора объектов. Внутри должен храниться динамический массив, который автоматически расширяется при добавлении
новых элементов и может сжиматься при удалении.
Container:operator[] — доступ по индексу (с проверкой границ, при ошибке — исключение или сообщение);operator== — сравнение двух контейнеров (поэлементно);operator< — лексикографическое сравнение (как у строк);push(const T& value) — добавление элемента в конец;pop() — удаление последнего элемента;deleteAt(size_t index) — удаление элемента по индексу;clear() — полная очистка контейнера;resize() - должен увеличивать capacity при переполнении и уменьшать приresize() вызывается автоматически:
capacity увеличивается, например, в 2 раза);size < capacity / 4);<< и >> для вывода в поток и ввода из потока.Iterator приведён в приложении.Iterator begin();Iterator end();Database<T>Класс-обёртка над Container<T>, который добавляет логику работы с файлами и
сортировку.
Database:readFromFile(filename) — чтение данных из файла;writeToFile(filename) — запись данных в файл;sortQsort(comparator) — сортировка с использованием собственной реализации быстрой сортировки (quicksort с шаблонным функтором);find(value) — поиск элемента с использованием std::find. Возвращает индекс элемента или -1, если элемент не найден;pushBack(value) — добавление элемента;deleteAt(index) — удаление по индексу;pop() — удаление последнего;clear() — очистка;display() — вывод на экран;inputFromConsole() — ввод с клавиатуры;Каждый метод Database должен вызывать соответствующий метод Container (реализация не дублируется) (например, pushBack() вызывает push() контейнера).
add() → push();removeLast() → pop();removeAt() → deleteAt().Вам нужно продемонстрировать работу Database с двумя типами данных:
Planet (описан ниже)Класс Planet
Поля:
Реализовать:
operator==operator< (сравнение по названию);bool (вывод: yes/no или true/false);<< и >> для ввода/вывода;В функции RunApplication() продумать вызов меню, где обеспечить возможность:
Database<Planet> и Database<MyClass>.std::copy_if и лямбда-выражения.Для работы copyIf в классе Database надо добавить методы begin() и end(), которые возвращают итераторы на начало и конец контейнера (используют соответствующие методы класса Container).template <typename T>
class Container {
<поля>
public:
// ... остальной код контейнера
class Iterator {
T* ptr;
public:
Iterator(T* p) : ptr(p) {}
// Разыменование
T& operator*() const { return *ptr; }
// Переход к следующему элементу
Iterator& operator++() { ++ptr; return *this; }
// Проверка на неравенство (важно для циклов и алгоритмов)
bool operator!=(const Iterator& other) const { return ptr != other.ptr; }
// Оператор равенства
bool operator==(const Iterator& other) const { return ptr == other.ptr; }
};
// Методы для связи с STL
Iterator begin() { return Iterator(<начало массива>); }
Iterator end() { return Iterator(<начало массива> + размер); }
};
Корректность работы с памятью — 2б.
Container, Database и обоих хранимых классов (Planet, MyClass).double free).Реализация класса Container<T> — 1б.
push() расширяет массив при переполнении.deleteAt() / pop() могут уменьшать capacity (например, если count <= capacity/4 и capacity > начальной).operator[] с проверкой границ.operator== — поэлементное сравнение.operator< — лексикографическое сравнение.push(), pop(), deleteAt(), clear(), resize(), begin(), end().Итератор (обязателен для поддержки STL-алгоритмов).Реализация класса Database<T> — вес 2б.
Обёртка над Container:
pushBack() вызывает push().removeAt() вызывает deleteAt().removeLast() вызывает pop().clear() вызывает clear().Правило пяти для Database (деструктор, копирование/перемещение).
Работа с файлами:
readFromFile — чтение через оператор >>.writeToFile — запись через оператор <<.Сортировка:
sortQsort(comparator)sortStd через std::sort.find(value) — использует std::find.
display, inputFromConsole.
Методы не дублируют логику — делегируют Container.
Классы Planet и ваш класс из 3-й ЛР — вес 1б
operator==.operator< (по названию для Planet).operator<< и operator>> для потокового ввода/вывода.Container (не нарушать инварианты при копировании).Демонстрация работы (RunApplication()) — вес 2б.
Проверяется наглядность и полнота:
Database<Planet> и Database<YourClass>.copyIf + лямбда.Вопросы к ДЗ
Container нужен конструктор перемещения, если есть конструктор копирования? При каком сценарии он вызывается?операторе[] на границы контейнера? Что будет, если выйти за пределы размера?delete и delete[]? Почему в деструкторе Container используется delete[] data, а не delete data?Database::find использует std::find? Что нужно реализовать в Container, чтобы std::find работал?Database<Planet>, если Planet не определяет operator==? А если не определяет operator<<?copyIf? Почему он требует, чтобы целевой контейнер имел pushBack.Database::readFromFile файл не существует или в нём неправильный формат?Container::begin() и Container::end() позволяют использовать range-based for? Будет ли работать for (auto& item : container)?Container::operator[] возвращает T&, а не T? Что это даёт?