本系列實作基於連續記憶體(陣列/向量)的多叉樹容器 mtree。此篇聚焦兄弟遍歷迭代器:訪問給定節點的所有同胞節點(含自身)。
template<bool is_const, bool is_reverse>
class sibling_iterator_impl : public iterator_base_impl<is_const> { ... };
using sibling_iterator = sibling_iterator_impl<false, false>;
using reverse_sibling_iterator = sibling_iterator_impl<false, true>;
using const_sibling_iterator = sibling_iterator_impl<true, false>;
using const_reverse_sibling_iterator = sibling_iterator_impl<true, true>;
iterator_base++/--、+/-= 算術運算begin()/end() 範圍界定first/last/increment/decrement(分正向/反向標籤分發)節點結構含 first_child, last_child, next_sibling, prev_sibling, parent(均為相對偏移量)。
first_child 偏移 → 第一個孩子。last_child 偏移 → 最後一個孩子。next_sibling 存在?偏移跳轉 : 返回 end() (size)。prev_sibling 存在?偏移跳轉 : 返回 end()。從基底迭代器轉換時,若節點非空,計算並保存父節點偏移至 root_(作為遍歷根界)。根節點無父節點時 root_ = size()。
// 正向遍歷兄弟
mtree<int,false>::iterator_base node = ...;
auto it = node.sibling_begin(); // 或 sibling_iterator it = node;
auto last = --it.end();
for (it = it.begin(); it != it.end(); ++it) {
cout << *it;
if (it != last) cout << ' ';
}
// 反向遍歷
auto rit = node.reverse_sibling_begin();
auto rlast = --rit.end();
for (rit = rit.begin(); rit != rit.end(); ++rit) { ... }
no_reverse_tag/reverse_tag 靜態多型,編譯期消除分支,零開銷抽象。兄弟遍歷迭代器展示了順序存儲樹結構高效導航的核心技術:以整數偏移量編碼樹拓撲,配合標籤分發實現多態導航。此設計模式可擴展至前序/後序/層序等各類遍歷器。