адаптер обратного итератора - PullRequest
7 голосов
/ 21 октября 2011

Я пытаюсь реализовать адаптер с обратным итератором для своих классов итераторов и const_iterator с небольшим количеством проблем.Если бы кто-нибудь мог помочь мне в этом, я был бы очень признателен!

Идея состоит в том, чтобы я мог создать обратный итератор из вызовов функций rbegin () и rend ()

* 1004.*

Я использую следующие определения типов в классе:

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;

Я не уверен, как еще можно заставить один класс reverse_iterator работать как для итератора, так и для const_iterator, если я не могу сделать I ::ссылка и я :: указатель.Я также попытался добавить шаблон перед ними, так как они определены в классе итераторов (например) как:

typedef T*                            pointer;
typedef T&                            reference;

Ответы [ 2 ]

5 голосов
/ 21 октября 2011

ссылка и указатель являются зависимыми именами, поэтому вы должны использовать

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;
1 голос
/ 21 октября 2011

Кроме того, вы забыли предоставить операторы сравнения с другими обратными итераторами того же типа.Это требование обратного итератора.

...