Хм, это не тривиальная вещь, и я не думаю, что вы можете избежать этого копирования, если вам действительно нужно использовать только (и один) std::vector
.
Лучшим решением будет использование Персистентная структура данных .
Но это было бы очень полезно, если вам нужно хранить более одной версии вашего контейнера.
Если вам нужна только предыдущая версия ..
Легкая вещь, которая приходит мне в голову и кажется, что она будет работать для вас, заключается в резервном копировании только элементов, которые вы измените. Вы можете использовать std::list
(или std::vector
) с std::pair< int, myClass >
. Таким образом, first
пары будет индексом элемента, который вы изменяете, а second
- резервной версией. Итак, в конце концов, если вам нужно восстановить резервную копию, вам нужно просто пройти через этот контейнер и «вернуть» старые данные.
Ситуация с удалением / добавлением элементов будет более сложной, но не неразрешимой. Вам нужно будет иметь больше контейнеров - один для удаленных элементов, один для добавленных элементов, один для измененных элементов и один для последовательности изменений. Таким образом, это даст вам возможность выполнить «отмену» шагов.
Ну, это звучит более сложно и довольно сложно для реализации (из-за всех возможных случаев), но увеличит производительность (уменьшит количество копий).
Другая вещь, которая приходит мне в голову - вы могли бы сначала проверить размер контейнера. А если он маленький, сделайте целую копию Если он большой - выполните «выборочное резервное копирование» или как там это называется.
Обратите внимание, что это не лучшее решение (я полагаю), а просто идея, которая у меня появилась прямо сейчас (мне никогда не нужна была такая вещь)
Надеюсь, что это помогает, даже если это кажется сложным и трудно осуществимым.