reverse_iterator adapter

reverse_iterator adapter

本文关键字:adapter iterator reverse      更新时间:2023-10-16

我正在尝试为我的迭代器和const_iterator类实现一个反向迭代器适配器,这有点麻烦。如果有人能引导我通过这一点,那将是非常感激!

这个想法是我应该能够从我的rbegin()和rend()函数调用中创建一个反向迭代器
reverse_iterator rbegin();
reverse_iterator rend();
const_reverse_iterator rbegin() const;
const_reverse_iterator rend() const;

我在类中使用以下类型定义:

typedef btree_iterator<T> iterator;
typedef const_btree_iterator<T> const_iterator;
typedef reverse_btree_iterator<iterator> reverse_iterator;
typedef reverse_btree_iterator<const_iterator> const_reverse_iterator;

如您所见,我希望能够使用模板创建反向迭代器,给reverse_iterator类一个迭代器或const_iterator。

不幸的是,它是这一点我卡住了…

下面是我目前的类定义,有错误。

template <typename I> class reverse_btree_iterator {
  typedef ptrdiff_t                     difference_type;
  typedef bidirectional_iterator_tag    iterator_category;
public:
  reverse_btree_iterator() : base_(I()) {}
  template <typename T> reverse_btree_iterator(const btree_iterator<T>& rhs) : base_(rhs) {}
  I base() { return base_; }
  I::reference operator*() const;
  I::pointer operator->() const;
  I& operator++();
  I operator++(int);
  I& operator--();
  I operator--(int);
  bool operator==(const I& other) const;
  bool operator!=(const I& other) const;
private:
  I base_;
};

我以前从来没有使用过这样的模板,所以很可能我完全误解了它们的用法…

因为I可以是迭代器或const_iterator,引用和指针的类型定义在这两个类之间是不同的。不能编译的行如下:

I::reference operator*() const;
I::pointer operator->() const;

我不确定如果我不能做I::reference和I::pointer,我还能如何使一个reverse_iterator类同时适用于迭代器和const_iterator。我还尝试在这些前面添加模板,因为它们在迭代器类中定义为(例如):

typedef T*                            pointer;
typedef T&                            reference;

引用和指针是相互依赖的名称,所以必须使用

typename I::reference operator*() const;
typename I::pointer operator->() const;

另外,构造函数应该只接受I .

然而,根本不需要编写这个类。标准库为此提供了reverse_iterator。如果你不满意,还有Boost.ReverseIterator

所需要的只是

typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

此外,您忘记为其他相同类型的反向迭代器提供比较操作符。