Чтобы сохранить данные в том же разделе памяти, вы, вероятно, захотите предоставить объект Allocator для используемого вами std::vector<TreeElement *>
и выделить его из своего блока.
Чтобы иметь возможность сериализовывать его, вместо хранения фактических указателей вы можете рассмотреть возможность смещения в блоке. Затем, когда вы снова читаете данные, вы можете добавить адрес начала блока в каждое смещение, чтобы вернуть его обратно в адрес.
В зависимости от используемого ОС/компилятора, для этого может быть некоторая поддержка. Например, компилятор Microsoft поддерживает указатели __based
, которые в значительной степени описаны мной: базовый адрес, и каждый указатель, основанный на этом адресе, на самом деле является просто смещением, а не полным указателем. Упоминание mmap
указывает, что, вероятно, не доступно вам напрямую, но возможно , что у вашего компилятора/операционной системы есть что-то подобное. В противном случае вам, вероятно, придется выполнять работу самостоятельно (например, с классом based_pointer
).
Реальный вопрос: почему вы пытаетесь сериализовать дерево перемещения вообще. В типичном случае вам лучше сэкономить текущую позицию на доске (или, примерно, историю движения) и перегенерировать дерево перемещения из этого при необходимости. Этого достаточно меньше, что его очень легко хранить.
Вы не можете сохранить эту структуру в файл, не сериализируя ее каким-либо образом, так как она содержит указатели и использует «вектор». –
Это три очень широких и очень разных вопроса, в одном лице. Пожалуйста, не делай этого. –
Я бы попытался присвоить имена узлам (просто использовать значение указателя) и трансверсив дерево в первом порядке заказов, таким образом вы можете сгенерировать упорядоченный 1-мерный массив, например: [{node: 1, move: .., parent : 0}, {узел: 2, перемещение: .., родитель: 1}, {узел: 3, ход: .., родитель: 2}, {узел: 4, ход: .., родитель: 3}] – arthurprs