【问题标题】:reverse_iterator adapterreverse_iterator 适配器
【发布时间】:2011-12-12 11:08:52
【问题描述】:

我正在尝试为我的迭代器和 const_iterator 类实现一个反向迭代器适配器,但有点麻烦。如果有人能指导我完成这个,那将不胜感激!

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

reverse_iterator rbegin();
reverse_iterator rend();
const_reverse_iterator rbegin() const;
const_reverse_iterator rend() const;

我在课堂上使用以下 typedef:

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,因此引用和指针的 typedef 在两个类之间有所不同。未编译的行如下:

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

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

typedef T*                            pointer;
typedef T&                            reference;

【问题讨论】:

  • Arent 指针/引用在 const_iterator 中定义为 const T*const T&amp; 您要适应吗?
  • template 非常接近。道具。

标签: c++ iterator adapter b-tree const-iterator


【解决方案1】:

引用和指针是依赖名,所以必须使用

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;

【讨论】:

    【解决方案2】:

    此外,您忘记提供与其他相同类型的反向迭代器的比较运算符。这是一个反向迭代器要求。

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 2011-07-24
      • 2018-12-20
      • 2017-05-02
      • 1970-01-01
      • 2012-09-14
      • 2017-08-02
      • 2012-07-14
      相关资源
      最近更新 更多