Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

reverse_iterator adapter

I'm trying to implement a reverse-iterator adaptor for my iterator and const_iterator classes with a little bit of trouble. If anyone could guide me through this, that would be greatly appreciated!

The idea is that I should be able to create a reverse-iterator from my rbegin() and rend() function calls

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

I'm using the following typedef's in the class:

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;

As you can see, I would like to be able to create reverse-iterators using templates, giving the reverse_iterator class either an iterator or const_iterator.

Unfortunately, it is this bit I'm stuck on...

Below is the class definition that I currently have, with errors.

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've never used templates like this before, so it is very likely I'm completely misunderstanding how they can be used...

Since I can be an iterator or a const_iterator, the typedef of reference and pointer vary between the two classes. The lines that aren't compiling are these:

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

I'm not sure how else I can make the one reverse_iterator class work for both iterator and const_iterator if I'm not able to do I::reference and I::pointer. I also tried adding template in front of those, since they are defined in the iterator class (for example) as:

typedef T*                            pointer;
typedef T&                            reference;
like image 898
Mick Avatar asked Oct 21 '11 09:10

Mick


People also ask

What is iterator Adaptor?

Iterator adaptors are a separate type of iterators with special behavior. They simplify the work with containers and are very useful in standard algorithms.

What is reverse iterator in C++?

A reverse iterator is made from a bidirectional, or random access iterator which it keeps as a member which can be accessed through base() . To iterate backwards use rbegin() and rend() as the iterators for the end of the collection, and the start of the collection respectively.

What is the difference between iterator and Const_iterator?

A const iterator points to an element of constant type which means the element which is being pointed to by a const_iterator can't be modified. Though we can still update the iterator (i.e., the iterator can be incremented or decremented but the element it points to can not be changed).


2 Answers

reference and pointer are dependent names, so you have to use

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

In addition, the constructor should accept just the I.

However, there is no need to write this class at all. The standard library has reverse_iterator for this. Or if you are not happy with that, there's also Boost.ReverseIterator.

All it takes is just

typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
like image 110
UncleBens Avatar answered Sep 29 '22 20:09

UncleBens


In addition, you forgot to provide comparison operators with other reverse iterators of the same type. This is a reverse iterator requirement.

like image 22
Puppy Avatar answered Sep 29 '22 18:09

Puppy