微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – reverse_iterator适配器

我正在尝试为我的迭代器和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_;

};

我之前从未使用过这样的模板,所以很可能我完全误解了它们的使用方式……

由于我可以是迭代器或const_iterator,因此引用和指针的typedef在两个类之间有所不同.没有编译的行是这些:

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

如果我不能做I :: reference和I :: pointer,我不知道如何让一个reverse_iterator类对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;

原文地址:https://www.jb51.cc/c/118233.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐