std::iterator_traits
Определено в заголовке <iterator> | ||
|---|---|---|
template< class Iter > struct iterator_traits; | ||
template< class T > struct iterator_traits<T*>; | ||
template< class T > struct iterator_traits<const T*>; | (удалено в C++20) |
std::iterator_traits — это класс шаблонов-функций, который предоставляет единый интерфейс к свойствам типов LegacyIterator. Это позволяет реализовывать алгоритмы только в терминах итераторов.
Шаблон может быть специализирован для пользовательских итераторов, чтобы информация об итераторе могла быть извлечена, даже если тип не предоставляет стандартные определения типов.
| Пользовательские специализации могут определить тип-член | (с C++20) |
Параметры шаблона
| Iter | - | тип итератора, для которого необходимо получить свойства |
Типы-члены
| Тип-член | Определение |
|---|---|
difference_type | Iter::difference_type |
value_type | Iter::value_type |
pointer | Iter::pointer |
reference | Iter::reference |
iterator_category | Iter::iterator_category |
| Если у |
(с C++17) (до C++20) |
||||||||||||||||||||||||||||||||||||
| Если у
В противном случае, если
В противном случае, если
В противном случае, у этого шаблона нет членов с такими именами ( | (с C++20) |
Специализации
Этот тип-шаблон может быть специализирован для типов, предоставляемых пользователем, которые могут использоваться в качестве итераторов. Библиотека стандартных шаблонов предоставляет частичные специализации для типов указателей T*, что позволяет использовать все алгоритмы, основанные на итераторах, с сырыми указателями.
| Библиотека стандартных шаблонов также предоставляет частичные специализации для некоторых адаптеров стандартных итераторов. | (с C++20) |
Специализация типов-членов T*
| Специализируется только если | (с C++20) |
| Тип-член | Определение |
|---|---|
difference_type | std::ptrdiff_t |
value_type | T(до C++20)std::remove_cv_t<T>(с C++20) |
pointer | T* |
reference | T& |
iterator_category | std::random_access_iterator_tag |
iterator_concept(C++20) | std::contiguous_iterator_tag |
Специализация типов-членов |
| Тип-член | Определение |
|---|---|
difference_type | std::ptrdiff_t |
value_type | T |
pointer | const T* |
reference | const T& |
iterator_category | std::random_access_iterator_tag |
Специализации для типов библиотеки
|
(C++20) | предоставляет единый интерфейс к свойствам типа std::common_iterator (специализация шаблона класса) |
|
(C++20) | предоставляет единый интерфейс к свойствам типа std::counted_iterator (специализация шаблона класса) |
Пример
Демонстрирует реализацию универсальной std::reverse() для двунаправленных итераторов.
#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
}Вывод:
5 4 3 2 1 5 4 3 2 1 5 4 3 2 1
См. также
|
(устарело в C++17) | базовый класс для облегчения определения необходимых типов для простых итераторов (шаблон класса) |
|
(C++20) | пустые типы классов, используемые для обозначения категорий итераторов (класс) |
|
(C++20)(C++20)(C++23)(C++20)(C++20)(C++20) | вычисляет связанные типы итератора (шаблон псевдонима) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/iterator_traits