За прошедшее время я задал много вопросов о древовидных структурах данных, но, похоже, я неправильно понял их в C ++.
В том, как я написал структуру данных, я не мог думатьединственного способа о том, как иметь «конечный» или «начальный» итератор.Как таковой, я пошел к подходу, чтобы включить всю функциональность в качестве методов-членов.Вместо использования стандартного подхода итераторов и алгоритмов.
Теперь цель с моей древовидной структурой состоит в том, чтобы: 1) как можно быстрее переместить ветку от одного дерева к другому.2) каждая ветвь должна быть самостоятельной.И действия, работающие с деревом, также должны быть способны выполняться на ветке.
Я просто создал класс, содержащий вектор.- Внутри вектора находятся другие объекты этого класса.Пример (я публикую здесь только минимальный пример, так как самая большая проблема, с которой я сейчас сталкиваюсь, заключается в том, что класс слишком велик для обработки):
template <typename ValTy>
class Tree {
private:
std::vector<std::unique_ptr<Tree> > subtrees;
ValTy value;
};
Как вы можете видеть из этого, я могу просто взятьчто-то из subtrees
- и используйте это либо как дерево, либо скопируйте вокруг.Однако, поскольку дерево верхнего уровня не имеет указаний о том, сколько поддеревьев (или сколько уровней) существует, невозможно указать «конечный итератор»?И как такие алгоритмы, как std :: find () не будут перебирать все дерево (и все его поддеревья)?
Возможно ли использовать эти алгоритмы, при этом сохраняя структуру простого"ветвление"?