类型定义在多叉树中,前序遍历迭代器有只读、读写、只读反转、读写反转4种,在mtree容器中的定义如下:
1
typedef pre_iterator_implpre_iterator;2typedef pre_iterator_implreverse_pre_iterator;3typedef pre_iterator_implconst_pre_iterator;4typedef pre_iterator_implconst_reverse_pre_iterator;
这4种类型定义,都是作为mtree模板类的公开成员,由于第2个参数决定了是否反转这个信息是在编译期决定,因此提供了反转迭代器特性模板类以作为标签分发来实现重载调用,其它各种迭代器也是一样,并在tree命名空间内而不作为mtree模板类的成员,其定义如下:
1
structreverse_tag{};2
structno_reverse_tag{};34 template5structreverse_trait;67 template<>8structreverse_trait9
{10 typedef reverse_tag type;11 };12 template<>13structreverse_trait14
{15 typedef no_reverse_tag type;16 };
接口定义 对于二叉树的前序遍历,我们都很熟悉,类似地,多叉树的前序遍历与二叉树一样:先访问根结点,再访问它的左子树(若存在),然后访问它的右子树(若存在),递归地,每颗子树内部结点的访问顺序都遵循着上面的规律。在这里设计上,由于树结点相对普通二叉树的结点结构增加了一个父结点偏移量域,因此是基于迭代回溯而非递归的方法来实现各种遍历的,这样就避免了递归实现带来的栈空间问题,而每种遍历都被设计为一种对应的迭代器来实现,多叉树容器只需提供各种遍历迭代器作为公共接口供外部使用,就可实现树的遍历。实现每种迭代器,关键是实现其前置递增(对应operator++)、前置递减方法(对应operator--),其它方法都可在此基础上实现。下面代码是前序遍历迭代器的声明:
1
template2classpre_iterator_impl :publiciterator_base_impl3
{4friendclassmtree;5typedef iterator_base_implbase_type;6typedef typename base_type::node_pointer_type node_pointer_type;7typedef typename base_type::tree_pointer_type tree_pointer_type;8usingbase_type::tree_;9usingbase_type::off_;10usingbase_type::root_;11usingbase_type::skip_progeny_;12public:13pre_iterator_impl();14pre_iterator_impl(constbase_type&iter);15pre_iterator_impl&operator++();16pre_iterator_impl&operator--();17pre_iterator_imploperator++(int);18pre_iterator_imploperator--(int);19pre_iterator_imploperator+(size_t off);20pre_iterator_impl&operator+=(size_t off);21pre_iterator_imploperator-(size_t off);22pre