
----- Original Message ----- From: "Joao Abecasis" <jpabecasis@zmail.pt>
Thorsten Ottosen wrote:
I'm not to keen on the idea that iterators are parameterized with an iteration policy. It would be more natural just to have
tree_t::inorder_iterator i = tr.inorder_begin(); tree_t::preorder_iterator i2 = tr.preorder_begin();
I think a generic tree should only be required to provide basic tree traversal iterators like from parent to child and among children or siblings.
From the basic iterators other types of traversal are possible. In my unfinished tree library (see my other post) the same effect would be accomplished with:
inorder_iterator<tree_t::tree_iterator> i = tr.root(); preorder_iterator<tree_t::tree_iterator> i2 = tr.root();
This keeps the interface and the implementation of the tree cleaner. One could also use BGL algorithms here if the tree exposes a Graph interface.
Why not have just one kind of iterator: template<typename T, typename Iter_T> struct tree { typedef typename Iter_T iterator; iterator preorder_begin(); iterator postorder_end(); iterator inorder_end(); iterator end(); iterator begin(); // calls inorder_begin() } ? Christopher Diggins Object Oriented Template Library (OOTL) http://www.ootl.org