Шапка. Помогите решить задачу. У меня уже есть наработка, но она слишком много потребляет памяти. Скорее всего решение в более хитром способе упаковке. Помогите. Вот сам код наработки -> #include <vector> #include <memory> #include <unordered_map> class CustomVector; class Memento { friend class CustomVector; std::shared_ptr<std::vector<int>> dataSnapshot; Memento(const std::shared_ptr<std::vector<int>>& data) : dataSnapshot(data) {} public: Memento() = default; Memento(const Memento& other) : dataSnapshot(other.dataSnapshot) {} }; class CustomVector { std::shared_ptr<std::vector<int>> data; void detach() { if (!data.unique()) { data = std::make_shared<std::vector<int>>(*data); } } public: CustomVector() : data(std::make_shared<std::vector<int>>()) {} void PushBack(int value) { detach(); data->push_back(value); } void PopBack() { detach(); data->pop_back(); } void Set(int index, int value) { detach(); if (index >= 0 && index < data->size()) { (*data)[index] = value; } } int Get(int index) const { if (index >= 0 && index < data->size()) { return (*data)[index]; } return 0; // Возвращаем значение по умолчанию, если индекс выходит за пределы. } Memento CreateMemento() { return Memento(data); } void Restore(const Memento& memento) { data = memento.dataSnapshot; } };
Выглядит как буд-то тебе намекают что в снэпшоте нужно хранить ссылку на список с которого сняли снэпшот + список изменений начиная с последнего снэпшота. в CustomVector при этом надо будет хранить список снэпшотов и при каждом действии надо запоминать в последнем снэпшоте эти действия. Восстановление списка по снэпшоту будет выглядеть как реверс кажого действия сохранённого в снэпшоте. Звучит мутновато, но ограничение по памяти не оставляет большого выбора. Если еще попытаться упростить то можно хранить вектор и вместе с ним стэк - вектор будет представлять текущее состояние а стэк - список произведенных операций. Создание снэпшота при этом это просто создание ссылки на текущую вершину стэка операций. Восстановление снэпшота - это откат всех действий на стэке до тех пор пока не дойдёшь до операции на которую в снэпшоте сохранена ссылка. Тут еще нюанс как это должно всё работать если я закидываю изменения в вектор потом делаю снэпшот, потом делаю изменения, делаю еще один снэпшот, потом восстанавливаю первый снэпшот, делаю действия и потом восстанавливаю второй снэпшот - при таком раскладе этот алгоритм не сработает.