C++ program to find the type of the given iterator

Given a program that uses an iterator, the task is to find the type of iterator used.

Examples:

Input : vector.begin()
Output : Random_Access Iterator

Input : list.begin()
Output : Bidirectional Iterator

There are namely five types of iterators present in the C++ Standard Library which are mentioned below:

  1. Forward Iterator in C++
  2. Bidirectional_Iterators in C++
  3. Input iterators in C++
  4. Output iterator in C++
  5. Random_access iterators in C++

Approach:

  • Iterator type can be checked by using typeid. typeid is a C++ language operator which returns type identification information at run time. It basically returns a type_info object, which is equality-comparable with other type_info objects.
  • Along with it use iterator traits. Traits class defines properties of iterators. Standard algorithms determine certain properties of the iterators passed to them and the range they represent by using the members of the corresponding iterator_traits instantiation.
  • Also a iterator category is passed which defines the iterator category the iterator belongs to.
    There are five type of tags namely: input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag, random_access_iterator_tag.
  • typename is used along with it to provide a type to the iterator during instanitation.
  • Now if the iterator category of the input iterator matches the existing iterator categories the result is displayed.
filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the type of iterator
#include <bits/stdc++.h>
using namespace std;
template <class T>
  
// function to return the iterator type
string get_iterator_type(T it)
{
    // if the iterator category of (it) matches input
    if (typeid(typename iterator_traits<T>::iterator_category)
        == typeid(input_iterator_tag))
        return "Input";
  
    // if the iterator category of (it) matches output
    else if (typeid(typename iterator_traits<T>::iterator_category)
             == typeid(output_iterator_tag))
        return "Output";
  
    // if the iterator category of (it) matches forward
    else if (typeid(typename iterator_traits<T>::iterator_category)
             == typeid(forward_iterator_tag))
        return "Forward";
  
    // if the iterator category of (it) matches bidirectional
    else if (typeid(typename iterator_traits<T>::iterator_category)
             == typeid(bidirectional_iterator_tag))
        return "Bidirectional";
  
    // if the iterator category of (it) matches random_access
    else if (typeid(typename iterator_traits<T>::iterator_category)
             == typeid(random_access_iterator_tag))
        return "Random_Access";
  
    // if the iterator category of (it)
    // does not match any of the above
    return "Missing";
}
  
// Driver code
int main()
{
    vector<int> v;
  
    // iterator that will be checked
    auto it = v.begin();
  
    cout << get_iterator_type(it) << " Iterator\n";
  
    return 0;
}

chevron_right


Output:

Random_Access Iterator

Time-Complexity: O(1) to find the iterator type



My Personal Notes arrow_drop_up

Do your best to show the world what you are capable of

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : Akanksha_Rai