table of contents
std::iterator_traits(3) | C++ Standard Libary | std::iterator_traits(3) |
NAME¶
std::iterator_traits - std::iterator_traits
Synopsis¶
Defined in header <iterator>
template< class Iter >
struct iterator_traits;
template< class T >
struct iterator_traits<T*>;
template< class T > (removed in C++20)
struct iterator_traits<const T*>;
std::iterator_traits is the type trait class that provides uniform interface
to the
properties of LegacyIterator types. This makes it possible to implement
algorithms
only in terms of iterators.
The template can be specialized for user-defined iterators so that the
information
about the iterator can be retrieved even if the type does not provide the
usual
typedefs.
User specializations may define the nested type iterator_concept to
one of iterator category tags, to indicate conformance to the iterator
(since C++20)
concepts.
Template parameters¶
Iter - the iterator type to retrieve properties for
Nested types
Nested type Definition
difference_type Iter::difference_type
value_type Iter::value_type
pointer Iter::pointer
reference Iter::reference
iterator_category Iter::iterator_category
If Iter does not have any of the five nested types above, then this template
(since
has no members by any of those names (std::iterator_traits is C++17)
SFINAE-friendly). (until
C++20)
If Iter does not have pointer, but has all four remaining nested types, then
these four nested types are declared as follows:
Nested type Definition
difference_type Iter::difference_type
value_type Iter::value_type
pointer void
reference Iter::reference
iterator_category Iter::iterator_category
Otherwise, if Iter satisfies the exposition-only concept
__LegacyInputIterator, the nested types are declared as follows:
Nested type Definition
difference_type std::incrementable_traits<Iter>::difference_type
value_type std::indirectly_readable_traits<Iter>::value_type
* Iter::pointer if valid.
pointer * Otherwise decltype(std::declval<Iter&>().operator->())
if valid.
* Otherwise void.
reference * Iter::reference if valid.
* Otherwise std::iter_reference_t<Iter>. (since
* Iter::iterator_category if valid. C++20)
* Otherwise, std::random_access_iterator_tag if Iter
satisfies __LegacyRandomAccessIterator.
iterator_category * Otherwise, std::bidirectional_iterator_tag if Iter
satisfies __LegacyBidirectionalIterator.
* Otherwise, std::forward_iterator_tag if Iter satisfies
__LegacyForwardIterator.
* Otherwise, std::input_iterator_tag.
Otherwise, if Iter satisfies the exposition-only concept __LegacyIterator,
the nested types are declared as follows:
Nested type Definition
* std::incrementable_traits<Iter>::difference_type if
difference_type valid.
* Otherwise void.
value_type void
pointer void
reference void
iterator_category std::output_iterator_tag
Otherwise, this template has no members by any of those names
(std::iterator_traits is SFINAE-friendly).
Specializations¶
This type trait may be specialized for user-provided types that
may be used as
iterators. The standard library provides partial specializations for pointer
types
T*, which makes it possible to use all iterator-based algorithms with raw
pointers.
The standard library also provides partial specializations for some (since
C++20)
standard iterator adaptors.
T* specialization nested types
Only specialized if std::is_object_v<T> is true. (since
C++20)
Nested type Definition
difference_type std::ptrdiff_t
T
value_type (until C++20)
std::remove_cv_t<T>
(since C++20)
pointer T*
reference T&
iterator_category std::random_access_iterator_tag
iterator_concept (since C++20) std::contiguous_iterator_tag
const T* specialization nested types
Nested type Definition
difference_type std::ptrdiff_t (until C++20)
value_type T
pointer const T*
reference const T&
iterator_category std::random_access_iterator_tag
Specializations for library types
provides uniform interface to the
std::iterator_traits<std::common_iterator> properties of the
std::common_iterator
(C++20) type
(class template specialization)
provides uniform interface to the
std::iterator_traits<std::counted_iterator> properties of the
std::counted_iterator
(C++20) type
(class template specialization)
Example¶
Shows a general-purpose std::reverse() implementation for bidirectional iterators.
// Run this code
#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
}
Output:¶
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
See also¶
iterator base class to ease the definition of required types for
(deprecated in C++17) simple iterators
(class template)
input_iterator_tag
output_iterator_tag
forward_iterator_tag empty class types used to indicate iterator categories
bidirectional_iterator_tag (class)
random_access_iterator_tag
contiguous_iterator_tag
(C++20)
iter_value_t
iter_reference_t
iter_const_reference_t
iter_difference_t
iter_rvalue_reference_t
iter_common_reference_t computes the associated types of an iterator
(C++20) (alias template)
(C++20)
(C++23)
(C++20)
(C++20)
(C++20)
2024.06.10 | http://cppreference.com |