Espacios de nombres
Variantes
Acciones

std::iterator_traits

De cppreference.com
< cpp‎ | iterator
 
 
Biblioteca de iteradores
Conceptos de iteradores
Primitivas de iteradores
Conceptos de algoritmos y servicios
Conceptos invocables indirectos
Requerimientos comunes de algoritmos
Servicios
Adaptadores de iteradores
Iteradores de flujos
Puntos de personalización de iteradores
Operaciones de iteradores
(C++11)
(C++11)
Acceso a rangos
(C++11)(C++14)
(C++11)(C++14)
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(C++17)
(C++17)
 
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 iterator_concept en una de las etiquetas de categoría de iterador, para indicar la conformidad con los conceptos del iterador.

(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 Iter no tiene ninguno de los cinco tipos anidados anteriores, entonces esta plantilla no tiene miembros con ninguno de esos nombres (std::iterator_traits es compatible con SFINAE).

(desde C++17)
(hasta C++20)

Si Iter no tiene pointer, pero tiene los cuatro tipos anidados restantes, entonces estos cuatro tipos anidados se declaran de la siguiente manera:

Tipo anidado Definición
difference_type Iter::difference_type
value_type Iter::value_type
pointer void
reference Iter::reference
iterator_category Iter::iterator_category


De lo contrario, si Iter satisface el concepto de solo exposición __LegacyInputIterator, los tipos anidados se declaran de la siguiente manera:

Tipo anidado Definición
difference_type std::incrementable_traits<Iter>::difference_type
value_type std::indirectly_readable_traits<Iter>::value_type
pointer
  • Iter::pointer si es válido.
  • De lo contrario decltype(std::declval<Iter&>().operator->()) si es válido.
  • De lo contrario void.
reference
iterator_category


De lo contrario, si Iter satisface el concepto de solo exposición __LegacyIterator, los tipos anidados se declaran de la siguiente manera:

Tipo anidado Definición
difference_type
value_type void
pointer void
reference void
iterator_category std::output_iterator_tag

Por el contrario, esta plantilla no tiene miembros con ninguno de esos nombres (std::iterator_traits es compatible con SFINAE).

(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*

Tipo anidado Definición
difference_type std::ptrdiff_t
value_type T
pointer const T*
reference const T&
iterator_category std::random_access_iterator_tag
(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) [editar]
Proporciona una interfaz uniforme para las propiedades del tipo std::counted_iterator.
(especialización de plantilla de clase) [editar]

[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) [editar]
Tipos clase vacíos para indicar categorías de iteradores.
(clase) [editar]
Calcula los tipos asociados de un iterador.
(plantilla de alias) [editar]