(7)间隔层定位方法的实现,代码如下:
1 template
2 template
3 inline void mtree::sibling_iterator_impl::first(no_reverse_tag)
4 {
5 assert(tree_&&root_<=tree_->size());
6 if (root_!=tree_->size())
7 forward_first();
8 else
9 off_ = 0;
10 }
11 template
12 template
13 inline void mtree::sibling_iterator_impl::first(reverse_tag)
14 {
15 assert(tree_&&root_<=tree_->size());
16 if (root_!=tree_->size())
17 forward_last();
18 else
19 off_ = 0;
20 }
21 template
22 template
23 inline void mtree::sibling_iterator_impl::last(no_reverse_tag)
24 {
25 assert(tree_&&root_<=tree_->size());
26 if (root_!=tree_->size())
27 forward_last();
28 else
29 off_ = 0;
30 }
31 template
32 template
33 inline void mtree::sibling_iterator_impl::last(reverse_tag)
34 {
35 assert(tree_&&root_<=tree_->size());
36 if (root_!=tree_->size())
37 forward_first();
38 else
39 off_ = 0;
40 }
41 template
42 template
43 inline void mtree::sibling_iterator_impl::increment(no_reverse_tag)
44 {
45 assert(tree_&&off_<=tree_->size());
46 off_!=tree_->size() forward_next() : first(no_reverse_tag());
47 }
48 template
49 template
50 inline void mtree::sibling_iterator_impl::increment(reverse_tag)
51 {
52 assert(tree_&&off_<=tree_->size());
53 off_!=tree_->size() forward_prev() : first(reverse_tag());
54 }
55 template
56 template
57 inline void mtree::sibling_iterator_impl::decrement(no_reverse_tag)
58 {
59 assert(tree_&&off_<=tree_->size());
60 off_!=tree_->size() forward_prev() : last(no_reverse_tag());
61 }
62 template
63 template
64 inline void mtree::sibling_iterator_impl::decrement(reverse_tag)
65 {
66 assert(tree_&&off_<=tree_->size());
67 off_!=tree_->size() forward_next() : last(reverse_tag());
68 }
四、使用示例
(1)正向遍历某结点的兄弟,代码如下:
1 mtree::iterator_base node;
2 mtree::sibling_iterator it = node;
3 mtree::sibling_iterator last = --it.end();
4 for (it = it.begin();it!=it.end();++it)
5 {
6 cout << *it;
7 if (it!=last)
8 cout <<" ";
9 }
(2)反向遍历某结点的兄弟,代码如下:
1 mtree::iterator_base node;
2 mtree::reverse_sibling_iterator r_it = node;
3 mtree::reverse_sibling_iterator r_last = --r_it.end();
4 for (r_it = r_it.begin();r_it!=r_it.end();++r_it)
5 {
6 cout << *r_it;
7 if (r_it!=r_last)
8 cout <<" ";
9 }