Iterator concepts | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Iterator primitives | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Algorithm concepts and utilities | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Indirect callable concepts | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Common algorithm requirements | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Utilities | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Iterator adaptors | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
Defined in header <iterator> | ||
template<class Iter> struct iterator_traits; | ||
template<class T> struct iterator_traits<T*>; | ||
template<class T> struct iterator_traits<const T*>; | (removed in C++20) | |
std::iterator_traits
is the type trait class that provides uniform interface to the properties ofLegacyIterator 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 | (since C++20) |
Contents |
Iter | - | the iterator type to retrieve properties for |
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 | (since C++17) (until C++20) | ||||||||||||||||||||||||||||||||||||
If
Otherwise, this template has no members by any of those names ( | (since C++20) |
This type trait may be specialized for user-provided types that may be used as iterators. The standard library provides partial specializations for pointer typesT*
, which makes it possible to use all iterator-based algorithms with raw pointers.
The standard library also provides partial specializations for some standard iterator adaptors. | (since C++20) |
T*
specialization nested typesOnly specialized ifstd::is_object_v<T> istrue. | (since C++20) |
Nested type | Definition |
difference_type | std::ptrdiff_t |
value_type | T (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
| (until C++20) |
provides uniform interface to the properties of thestd::common_iterator type (class template specialization)[edit] | |
provides uniform interface to the properties of thestd::counted_iterator type (class template specialization)[edit] |
Shows a general-purposestd::reverse() implementation for bidirectional iterators.
#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 15 4 3 2 15 4 3 2 1
(deprecated in C++17) | base class to ease the definition of required types for simple iterators (class template)[edit] |
empty class types used to indicate iterator categories (class)[edit] | |
(C++20)(C++20)(C++23)(C++20)(C++20)(C++20) | computes the associated types of an iterator (alias template)[edit] |