7 {
8 off_ += p_node->next_sibling_;
9 p_node = &(*tree_)[off_];
10 while (p_node->first_child_)
11 {
12 off_ += p_node->first_child_;
13 p_node = &(*tree_)[off_];
14 }
15 }
16 else
17 {
18 if (off_==root_||!p_node->parent_)
19 off_ = tree_->size();
20 else
21 off_ -= p_node->parent_;
22 }
23 } (4)forward_prev:求正向前一个结点,步骤如下:a) 如果当前结点有孩子且不跳过后代,那么就是最后一个孩子结点,反之则转到b)。 b) 如果当前结点不是根结点且有左兄弟结点,那么就是其左兄弟结点,否则转到c)。 c) 一直向上回溯,直到碰到根结点或父结点为空或存在左兄弟结点时才结束,如果碰到根结点或父结点为空,那么返回end,否则就是其左兄弟结点。代码如下:
1 template
2 template
3 inline void mtree
4 {
5 node_pointer_type p_node = &(*tree_)[off_];
6 if (!skip_progeny_&&p_node->last_child_)
7 {
8 off_ += p_node->last_child_;
9 }
10 else if (off_!=root_&&p_node->prev_sibling_)
11 {
12 off_ -= p_node->prev_sibling_;
13 }
14 else
15 {
16 while (off_!=root_&&p_node->parent_&&!p_node->prev_sibling_)
17 {
18 off_ -= p_node->parent_;
19 p_node = &(*tree_)[off_];
20 }
21 if (off_==root_||!p_node->parent_)
22 off_ = tree_->size();
23 else
24 off_ -= p_node->prev_sibling_;
25 }
26 }
(5)构造函数的实现,代码如下:
1 template
2 template
3 inline mtree
4 :base_type()
5 {
6 root_ = 0;
7 }
8 template
9 template
10 inline mtree
11 :base_type(iter)
12 {
14 }
(6)公有方法的实现,代码如下:
1 template
2 template
3 inline typename mtree
4 mtree
5 {
6 increment(typename reverse_trait
7 return *this;
8 }
9 template
10 template
11 inline typename mtree
12 mtree
13 {
14 decrement(typename reverse_trait
15 return *this;
16 }
17 template
18 template
19 inline typename mtree
20 mtree
21 {
22 post_iterator_impl
23 --(*this);
24 return iter;
25 }
26 template
27 template
28 inline typename mtree
29 mtree
30 {
31 post_iterator_impl
32 --(*this);
33 return iter;
34 }
35 template
36 template
37 inline typename mtree
38 mtree
39 {
40 post_iterator_impl
41 iter += off;
42 return iter;
43 }
44 template
45 template
46 inline typename mtree
47 mtree
48 {
49 while (off)
50 {
51 if (base_type::is_null()) break;
52 ++(*this); --off;
53 }
54