std:: iterator_traits
|
Definido en el 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 de rasgos de tipo que proporciona una interfaz uniforme para las propiedades de los tipos
LegacyIterator
. Esto hace posible implementar algoritmos únicamente en términos de iteradores.
La plantilla puede especializarse para iteradores definidos por el usuario de modo que la información sobre el iterador pueda recuperarse incluso si el tipo no proporciona los typedefs habituales.
|
Las especializaciones de usuario pueden definir el tipo anidado
|
(desde C++20) |
Contenidos |
Parámetros de plantilla
| Iter | - | el tipo de iterador para recuperar propiedades |
Tipos de miembros
| 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
De lo contrario, esta plantilla no tiene miembros con esos nombres (
|
(desde C++20) |
Especializaciones
Este rasgo de tipo puede especializarse para tipos proporcionados por el usuario que pueden utilizarse como iteradores. La biblioteca estándar proporciona especializaciones parciales para tipos de puntero
T*
, lo que permite utilizar todos los algoritmos basados en iteradores con punteros sin procesar.
|
La biblioteca estándar también proporciona especializaciones parciales para algunos adaptadores de iteradores estándar. |
(desde C++20) |
T*
especialización de tipos anidados
|
Solo se especializa si std:: is_object_v < T > es true . |
(since 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 |
|
const T * tipos anidados de especialización
|
(hasta C++20) |
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) |
Ejemplo
Muestra una implementación de propósito general de std:: reverse ( ) para iteradores bidireccionales.
#include <iostream> #include <iterator> #include <list> #include <vector> template<class BidirIt> void my_reverse(BidirIt first, BidirIt last) { typename std::iterator_traits<BidirIt>::difference_type n = std::distance(first, last); for (--n; n > 0; n -= 2) { typename std::iterator_traits<BidirIt>::value_type tmp = *first; *first++ = *--last; *last = tmp; } } int main() { std::vector<int> v{1, 2, 3, 4, 5}; my_reverse(v.begin(), v.end()); for (int n : v) std::cout << n << ' '; std::cout << '\n'; std::list<int> l{1, 2, 3, 4, 5}; my_reverse(l.begin(), l.end()); for (int n : l) std::cout << n << ' '; std::cout << '\n'; int a[]{1, 2, 3, 4, 5}; my_reverse(a, a + std::size(a)); for (int n : a) std::cout << n << ' '; std::cout << '\n'; // std::istreambuf_iterator<char> i1(std::cin), i2; // my_reverse(i1, i2); // compilation error: i1, i2 are input iterators }
Salida:
5 4 3 2 1 5 4 3 2 1 5 4 3 2 1
Véase también
|
(obsoleto en C++17)
|
clase base para facilitar la definición de tipos requeridos para iteradores simples
(plantilla de clase) |
|
tipos de clases vacías utilizadas para indicar categorías de iteradores
(clase) |
|
|
(C++20)
(C++20)
(C++23)
(C++20)
(C++20)
(C++20)
|
calcula los tipos asociados de un iterador
(plantilla de alias) |