std::iterator_traits
Definido en el archivo de encabezado <iterator>
|
||
template< class Iter > struct iterator_traits; |
||
template< class T > struct iterator_traits<T*>; |
||
template< class T > struct iterator_traits<const T*>; |
(eliminado en C++20) | |
std::iterator_traits
es la clase rasgo de tipo que proporciona una interfaz uniforme para las propiedades de los tipos Iterator. Esto permite implementar algoritmos solo en términos de iteradores.
La plantilla se puede especializar para iteradores definidos por el usuario, de modo que se pueda recuperar la información sobre el iterador incluso si el tipo no proporciona las definiciones de tipo habituales.
Las especializaciones del usuario pueden definir el tipo anidado |
(desde C++20) |
Contenido |
[editar] Parámetros de plantilla
Iter | - | El tipo de iterador para el que se recuperarán las propiedades. |
[editar] Tipos miembro
Tipo anidado | Definición |
difference_type
|
Iter::difference_type
|
value_type
|
Iter::value_type
|
pointer
|
Iter::pointer
|
reference
|
Iter::reference
|
iterator_category
|
Iter::iterator_category
|
Si |
(desde C++17) (hasta C++20) | ||||||||||||||||||||||||||||||||||||
Si
Por el contrario, esta plantilla no tiene miembros con ninguno de esos nombres ( |
(desde C++20) |
[editar] Especializaciones
Este rasgo de tipo puede especializarse para tipos proporcionados por el usuario que pueden usarse como iteradores. La biblioteca estándar proporciona especializaciones parciales para tipos puntero T*
, lo que permite usar todos los algoritmos basados en iteradores con punteros sin formato.
La biblioteca estándar también proporciona especializaciones parciales para algunos adaptadores de iteradores estándar. |
(desde C++20) |
[editar] Tipos anidados para la especialización T*
Solo se especializa si std::is_object_v<T> es true. |
(desde C++20) |
Tipo anidado | Definición |
difference_type
|
std::ptrdiff_t |
value_type
|
T (hasta C++20)std::remove_cv_t<T> (desde C++20)
|
pointer
|
T*
|
reference
|
T&
|
iterator_category
|
std::random_access_iterator_tag |
iterator_concept (desde C++20)
|
std::contiguous_iterator_tag |
Tipos anidados para la especialización const T*
|
(hasta C++20) |
[editar] Especializaciones para tipos de biblioteca
Proporciona una interfaz uniforme para las propiedades del tipo std::common_iterator. (especialización de plantilla de clase) | |
Proporciona una interfaz uniforme para las propiedades del tipo std::counted_iterator. (especialización de plantilla de clase) |
[editar] Ejemplo
Muestra una implementación de propósito general std::reverse() para iteradores bidireccionales.
#include <iostream> #include <iterator> #include <list> #include <vector> template<class IterBidir> void invertir_rango(IterBidir first, IterBidir last) { typename std::iterator_traits<IterBidir>::difference_type n = std::distance(first, last); for (--n; n > 0; n -= 2) { typename std::iterator_traits<IterBidir>::value_type tmp = *first; *first++ = *--last; *last = tmp; } } int main() { std::vector<int> v{1, 2, 3, 4, 5}; invertir_rango(v.begin(), v.end()); for (int n : v) std::cout << n << ' '; std::cout << '\n'; std::list<int> l{1, 2, 3, 4, 5}; invertir_rango(l.begin(), l.end()); for (int n : l) std::cout << n << ' '; std::cout << '\n'; int a[]{1, 2, 3, 4, 5}; invertir_rango(a, a + std::size(a)); for (int n : a) std::cout << n << ' '; std::cout << '\n'; // std::istreambuf_iterator<char> i1(std::cin), i2; // invertir_rango(i1, i2); // Error de compilación: i1, i2 son iteradores de entrada }
Salida:
5 4 3 2 1 5 4 3 2 1 5 4 3 2 1
[editar] Véase también
El iterador básico. (plantilla de clase) | |
Tipos clase vacíos para indicar categorías de iteradores. (clase) | |
Calcula los tipos asociados de un iterador. (plantilla de alias) |