Programa C++ para encontrar el tipo del iterador dado

Dado un programa que usa un iterador, la tarea es encontrar el tipo de iterador usado.

Ejemplos:

Entrada: vector.begin()
Salida: Random_Access Iterator

Entrada: list.begin()
Salida: iterador bidireccional

Hay cinco tipos de iteradores presentes en la biblioteca estándar de C++ que se mencionan a continuación:

  1. Reenviar iterador en C++
  2. Iteradores_bidireccionales en C++
  3. Iteradores de entrada en C++
  4. Iterador de salida en C++
  5. Iteradores de acceso aleatorio en C++

Acercarse:

  • El tipo de iterador se puede verificar usando typeid . typeid es un operador de lenguaje C++ que devuelve información de identificación de tipo en tiempo de ejecución. Básicamente, devuelve un objeto type_info, que es comparable en igualdad con otros objetos type_info.
  • Junto con él, use rasgos de iterador . La clase Traits define las propiedades de los iteradores. Los algoritmos estándar determinan ciertas propiedades de los iteradores que se les pasan y el rango que representan mediante el uso de los miembros de la correspondiente instanciación de iterator_traits.
  • También se pasa una categoría de iterador que define la categoría de iterador a la que pertenece el iterador.
    Hay cinco tipos de etiquetas, a saber: input_iterator_tag , output_iterator_tag , forward_iterator_tag , bidireccional_iterator_tag , random_access_iterator_tag .
  • typename se usa junto con él para proporcionar un tipo al iterador durante la instanciación.
  • Ahora, si la categoría de iterador del iterador de entrada coincide con las categorías de iterador existentes, se muestra el resultado.
// 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;
}
Producción:

Random_Access Iterator

Tiempo-Complejidad: O(1) para encontrar el tipo de iterador

Publicación traducida automáticamente

Artículo escrito por Subash23 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *