C++ Bidirectional Iterator

  • A Bidirectional iterator supports all the features of a forward iterator, and it also supports the two decrement operators (prefix and postfix).
  • Bidirectional iterators are the iterators used to access the elements in both the directions, i.e., towards the end and towards the beginning .
  • A random access iterator is also a valid bidirectional iterator.
  • Many containers implement the bidirectional iterator such as list, set, multiset, map, multimap.
  • C++ provides two non-const iterators that move in both the directions are iterator and reverse iterator.
  • C++ Bidirectional iterator has the same features like the forward iterator, with the only difference is that the bidirectional iterator can also be decremented.
  • Properties Of Bidirectional Iterator

Suppose x and y are the two iterators :

Property Expressions
A Bidirectional iterator is a default-constructible, copy-assignable and destructible. A x;A y(x);y=x;
It can be compared by using equality or inequality operator. x==yx!=y
It can be dereferenced means we can retrieve the value by using adereference operator(*). *x
A mutable iterator can be dereferenced as an lvalue. *x = t
A Bidirectional iterator can be incremented. x++++x
A Bidirectional iterator can also be decremented. x----x

In the above table, 'A' is of bidirectional type, x and y are the objects of an iterator type, and 't' is an objeccpp tutorialed by the iterator.

Let's see a simple example:

Example

#include <iostream>

#include<iterator>

#include<vector>

using namespace std;

int main()

{

   vector<int> v{1,2,3,4,5};                       // vector declaration

   vector<int> ::iterator itr;                        // iterator declaration

   vector<int> :: reverse_iterator ritr;         // reverse iterator declaration

   for(itr = v.begin();itr!=v.end();itr++)

   {

       cout<<*itr<<" ";

   }

   cout<<'\n';

   for(ritr = v.rbegin();ritr!= v.rend();ritr++)

   {

       cout<<*ritr<<" ";

   }

    return 0;

}

Output:

Output

1 2 3 4 5

5 4 3 2 1

Features of the Bidirectional iterator

  • Equality/Inequality operator : A bidirectional iterator can be compared by using an equality or inequality operator . The two iterators are equal only when both the iterators point to the same position.

Suppose 'A' and 'B' are the two iterators:

Example

A==B;

A!=B;
  • Dereferencing : A bidirectional iterator can also be dereferenced both as an lvalue and rvalue .

Suppose 'A' is an iterator and 't' is an integer variable:

Example

*A = t;

  t = *A
  • Incrementable : A bidirectional iterator can be incremented by using an operator++ function.
  • Example
    
    A++;
    
    ++A;
    
  • Decrementable: A bidirectional iterator can also be decremented by using an Operator -- function.
  • Example
    
    A--;
    
    --A;
    

    Limitations Of Bidirectional Iterator:

  • Relational operator : An equality or inequality operator can be used with the bidirectional iterator, but the other iterators cannot be applied on the bidirectional iterator.

Suppose 'A' and 'B' are the two iterators:

Example

A==B;           // valid

A<=B;           // invalid
  • Arithmetic operator : An arithmetic operator cannot be used with the bidirectional iterator as it accesses the data sequentially.
  • Example
    
    A+2;              // invalid
    
    A+1;              // invalid
    
  • Offset dereference operator : A Bidirectional iterator does not support the offset dereference operator or subscript operator for the random access of an element.

Input Required

This code uses input(). Please provide values below: