example1_basic_and_traits.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <vector>
#include <list>
#include <iterator>

template <typename Iterator>
void print_iterator_category(const Iterator& it) {
    if (std::is_same_v<typename std::iterator_traits<Iterator>::iterator_category, std::random_access_iterator_tag>)
        std::cout << "Random Access Iterator" << std::endl;
    else if (std::is_same_v<typename std::iterator_traits<Iterator>::iterator_category, std::bidirectional_iterator_tag>)
        std::cout << "Bidirectional Iterator" << std::endl;
    else if (std::is_same_v<typename std::iterator_traits<Iterator>::iterator_category, std::forward_iterator_tag>)
        std::cout << "Forward Iterator" << std::endl;
    else if (std::is_same_v<typename std::iterator_traits<Iterator>::iterator_category, std::input_iterator_tag>)
        std::cout << "Input Iterator" << std::endl;
    else if (std::is_same_v<typename std::iterator_traits<Iterator>::iterator_category, std::output_iterator_tag>)
        std::cout << "Output Iterator" << std::endl;
}

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::list<int> lst = {1, 2, 3, 4, 5};

    std::cout << "Vector iterator category: ";
    print_iterator_category(vec.begin());

    std::cout << "List iterator category: ";
    print_iterator_category(lst.begin());

    return 0;
}
Back to iteratior