C ++ реализация игрового дерева - PullRequest
1 голос
/ 19 февраля 2012

Я собираюсь представить шахматную игру как структуру C ++.Я думаю, что лучшим вариантом будет древовидная структура (потому что на каждом глубине у нас есть несколько возможных ходов).

struct TreeElement{
  SomeMoveType move;
  TreeElement *parent;
  std::vector<TreeElement*> children;
};

Как эффективно хранить данные такого типа в файле?Есть ли способ убедиться, что вся древовидная структура будет храниться в той же части памяти, что позволит использовать функцию mmap?

Ответы [ 2 ]

3 голосов
/ 19 февраля 2012

Чтобы сохранить данные в том же разделе памяти, вы, вероятно, захотите предоставить объект Allocator для std::vector<TreeElement *>, который вы используете, и получить его из вашего блока.

Чтобы иметь возможность сериализовать его, вместо хранения фактических указателей, вы можете рассмотреть возможность хранения смещений в блоке. Затем, когда вы читаете данные обратно, вы можете добавить адрес начала блока к каждому смещению, чтобы превратить его обратно в адрес.

В зависимости от используемой вами ОС / компилятора, возможно, уже есть некоторая поддержка. Например, компилятор Microsoft поддерживает указатели __based, которые в значительной степени соответствуют описанному мною: базовый адрес, и каждый указатель, основанный на этом адресе, на самом деле является просто смещением, а не полным указателем. Упоминание mmap указывает на то, что это, вероятно, не доступно вам напрямую, но возможно , что используемый вами компилятор / ОС имеет нечто подобное. В противном случае вам, вероятно, придется выполнять работу самостоятельно (например, с классом based_pointer).

Реальный вопрос в том, почему вы вообще пытаетесь сериализовать дерево перемещений. В типичном случае вам лучше просто сохранить текущую позицию доски (или, что примерно то же самое, историю ходов) и заново сгенерировать дерево ходов из этого, когда / при необходимости. Этого достаточно меньше, чтобы его было действительно легко хранить.

0 голосов
/ 24 февраля 2012

Я думаю, что использование std :: vector не лучший способ создания дерева, построение дерева стилей с односвязными списками, вероятно, проще и лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...