iterator_traits (Struct)
Struct del asistente de plantilla usado para especificar todas las definiciones de tipo críticas que debe tener un iterador.
Sintaxis
struct iterator_traits {
typedef typename Iterator::iterator_category iterator_category;
typedef typename Iterator::value_type value_type;
typedef typename Iterator::difference_type difference_type;
typedef difference_type distance_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
};
Comentarios
El struct de plantilla define los tipos de miembro:
iterator_category
: un sinónimo deIterator::iterator_category
.value_type
: un sinónimo deIterator::value_type
.difference_type
: un sinónimo deIterator::difference_type
.distance_type
: un sinónimo deIterator::difference_type
.pointer
: un sinónimo deIterator::pointer
.reference
: un sinónimo deIterator::reference
.
Las especializaciones parciales determinan los tipos críticos asociados a un puntero de objeto de tipo Type * o const Type *.
En esta implementación también se pueden usar varias funciones de plantilla que no usan la especialización parcial:
template <class Category, class Type, class Diff>
C _Iter_cat(const iterator<Category, Ty, Diff>&);
template <class Ty>
random_access_iterator_tag _Iter_cat(const Ty *);
template <class Category, class Ty, class Diff>
Ty *val_type(const iterator<Category, Ty, Diff>&);
template <class Ty>
Ty *val_type(const Ty *);
template <class Category, class Ty, class Diff>
Diff *_Dist_type(const iterator<Category, Ty, Diff>&);
template <class Ty>
ptrdiff_t *_Dist_type(const Ty *);
que determinan algunos de estos mismos tipos más indirectamente. Estas funciones se usan como argumentos en una llamada de función. Su única finalidad es proporcionar un parámetro de plantilla de clase útil a la función a la que se llama.
Ejemplo
// iterator_traits.cpp
// compile with: /EHsc
#include <iostream>
#include <iterator>
#include <vector>
#include <list>
using namespace std;
template< class it >
void
function( it i1, it i2 )
{
iterator_traits<it>::iterator_category cat;
cout << typeid( cat ).name( ) << endl;
while ( i1 != i2 )
{
iterator_traits<it>::value_type x;
x = *i1;
cout << x << " ";
i1++;
};
cout << endl;
};
int main( )
{
vector<char> vc( 10,'a' );
list<int> li( 10 );
function( vc.begin( ), vc.end( ) );
function( li.begin( ), li.end( ) );
}
/* Output:
struct std::random_access_iterator_tag
a a a a a a a a a a
struct std::bidirectional_iterator_tag
0 0 0 0 0 0 0 0 0 0
*/
Requisitos
Encabezado:<iterator>
Espacio de nombres: std
Consulte también
<iterator>
Seguridad para subprocesos en la biblioteca estándar de C++
Referencia de biblioteca estándar de C++