以下代码的输出不正确。它应该只输出树中的叶子:
tree<Node> gameTree;
tree<Node>::iterator root = gameTree.insert(gameTree.begin(),Node(14));
tree<Node>::iterator first = gameTree.append_child(root,Node(32.0));
tree<Node>::iterator second = gameTree.append_child(root,Node(64.0));
gameTree.append_child(second,Node(21.0));
gameTree.append_child(second,Node(24.0));
tree<Node>::iterator begin = gameTree.begin_leaf();
tree<Node>::iterator end = gameTree.end_leaf();
int x = 0;
while (begin != end)
{
cout << begin->value << endl;
begin++;
}
但它输出:
32
64
21
24
当输出应该是:
32
21
24
答案 0 :(得分:2)
从文档中你应该使用leaf_iterator而不是迭代器,你看到的输出来自顺序遍历,你想做一个我正在猜测的叶子遍历。
顺便说一句,感谢您发布此消息我刚刚开始寻找树容器
HTH
答案 1 :(得分:2)
发生的事情是迭代器类实际上只是pre_order_traversal类的typedef。因此,当您将gameTree.beginLeaf()
(返回leaf_iterator)的结果设置为迭代器时,它会调用pre_order_iterator的复制构造函数,因为有一个为pre_order_traversal(const iterator_base&)
定义的构造函数(iterator_base是所有其他迭代器的超类,包括leaf_iterator),因此这将从leaf_iterator创建一个新的pre_order_iterator。然后,当您使用该迭代器时,它会执行深度优先遍历,而不是迭代遍历叶子。如果切换到leaf_iterator而不是迭代器,问题就会消失。
这也是下面评论中提到的直接形式(其中值未分配给迭代器)正常工作的原因。
答案 2 :(得分:1)
我不知道tree<>
是什么,也不知道append_child
的语义,但从我看来,32,64,21和24都低于层次结构的根(14岁的儿童和孙子女);我没有看到问题。
为什么要跳过64,但不是24?