用于const和非const容器的C ++ Custom迭代器

时间:2015-06-18 14:26:35

标签: c++ stl iterator const containers

我想实现一个自定义树类型(类似stl)和树的自定义迭代器。正如我对标准库的理解,任何容器只有4种类型的迭代器(const /非const,反向/非反向的组合),而const则是指它所拥有的数据,而不是容器本身。

由于某种原因,在我的迭代器类中,我有类型树的属性(我需要返回一个对它的const正确引用),这迫使我在用户创建一个const容器时使用不同的类型。

template <typename T> class tree;
template <typename T> class node;

template <typename T, typename Tree = tree<T>, typename Node = node<T>>
class iterator_base : public std::iterator<std::bidirectional_iterator_tag, T> {
protected:
    Tree *tree;
    Node *current_node;
public:
    Tree& get_tree() const {
        return *tree;
    }
    //...
};

是否有可能对const treetree使用相同的迭代器类型?

1 个答案:

答案 0 :(得分:-1)

基本上你应该可以使用以下版本的迭代器:

0.5

唯一缺少的是从iterator到const_iterator的隐式转换(可以使用template_if或通过子类化并仅指定这些成员来完成。如果使用typedef iterator_base<T, tree<T>, node<T> > iterator; //either use T or const T for const_iterator (depends on your definition //of const correctness in this case. typedef iterator_base<T, const tree<T>, const node<T> > const_iterator; ,则可能需要其他辅助函数来转换{ {1}}成const T

注意:只有在迭代器上没有直接修改树/节点的特殊非const成员时,此方法才有效(这样的方法将/不应该在const_iterator上工作)