Загрузка...

Save. Pettern programming problem.

Thread in C/C++ created by alsoso_guru Oct 25, 2023. 101 view

  1. alsoso_guru
    alsoso_guru Topic starter Oct 25, 2023 12 Sep 30, 2023
    Шапка. Помогите решить задачу.
    [IMG]
    У меня уже есть наработка, но она слишком много потребляет памяти.

    [IMG]
    Скорее всего решение в более хитром способе упаковке. Помогите.

    Вот сам код наработки ->

    #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;
    }
    };
     
  2. vtlstolyarov
    Выглядит как буд-то тебе намекают что в снэпшоте нужно хранить ссылку на список с которого сняли снэпшот + список изменений начиная с последнего снэпшота. в CustomVector при этом надо будет хранить список снэпшотов и при каждом действии надо запоминать в последнем снэпшоте эти действия. Восстановление списка по снэпшоту будет выглядеть как реверс кажого действия сохранённого в снэпшоте.

    Звучит мутновато, но ограничение по памяти не оставляет большого выбора.

    Если еще попытаться упростить то можно хранить вектор и вместе с ним стэк - вектор будет представлять текущее состояние а стэк - список произведенных операций. Создание снэпшота при этом это просто создание ссылки на текущую вершину стэка операций. Восстановление снэпшота - это откат всех действий на стэке до тех пор пока не дойдёшь до операции на которую в снэпшоте сохранена ссылка. Тут еще нюанс как это должно всё работать если я закидываю изменения в вектор потом делаю снэпшот, потом делаю изменения, делаю еще один снэпшот, потом восстанавливаю первый снэпшот, делаю действия и потом восстанавливаю второй снэпшот - при таком раскладе этот алгоритм не сработает.
     
Loading...
Top