Dado un programa que usa un iterador, la tarea es encontrar el tipo de iterador usado.
Ejemplos:
Entrada: vector.begin()
Salida: Random_Access IteratorEntrada: list.begin()
Salida: iterador bidireccional
Hay cinco tipos de iteradores presentes en la biblioteca estándar de C++ que se mencionan a continuación:
- Reenviar iterador en C++
- Iteradores_bidireccionales en C++
- Iteradores de entrada en C++
- Iterador de salida en C++
- 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