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