Spec-Zone.ru › C++

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. Это позволяет реализовывать алгоритмы только в терминах итераторов.

Шаблон может быть специализирован для пользовательских итераторов, чтобы информация об итераторе могла быть извлечена, даже если тип не предоставляет стандартные определения типов.

Пользовательские специализации могут определить тип-член iterator_concept как один из меток категорий итераторов, чтобы указать соответствие концепциям итераторов.

(с C++20)

Параметры шаблона

Iter - тип итератора, для которого необходимо получить свойства

Типы-члены

Тип-член Определение
difference_type Iter::difference_type
value_type Iter::value_type
pointer Iter::pointer
reference Iter::reference
iterator_category Iter::iterator_category

Если у Iter отсутствуют все пять типов-членов difference_type, value_type, pointer, reference, и iterator_category, тогда у этого шаблона нет членов с такими именами (std::iterator_traits дружественен к SFINAE).

(с C++17)
(до C++20)

Если у Iter отсутствует pointer, но есть все четыре оставшиеся типа-члена, то типы-члены объявляются следующим образом:

Тип-член Определение
difference_type Iter::difference_type
value_type Iter::value_type
pointer void
reference Iter::reference
iterator_category Iter::iterator_category

В противном случае, если Iter удовлетворяет концепции (только для демонстрации) __LegacyInputIterator, типы-члены объявляются следующим образом:

Тип-член Определение
difference_type std::incrementable_traits<Iter>::difference_type
value_type std::indirectly_readable_traits<Iter>::value_type
pointer Iter::pointer если допустимо, в противном случае decltype(std::declval<Iter&>().operator->()) если допустимо, в противном случае void
reference Iter::reference если допустимо, в противном случае std::iter_reference_t<Iter>
iterator_category Iter::iterator_category если допустимо,

в противном случае, std::random_access_iterator_tag если Iter удовлетворяет __LegacyRandomAccessIterator,
в противном случае, std::bidirectional_iterator_tag если Iter удовлетворяет __LegacyBidirectionalIterator,
в противном случае, std::forward_iterator_tag если Iter удовлетворяет __LegacyForwardIterator,
в противном случае, std::input_iterator_tag

В противном случае, если Iter удовлетворяет концепции (только для демонстрации) __LegacyIterator, типы-члены объявляются следующим образом:

Тип-член Определение
difference_type std::incrementable_traits<Iter>::difference_type если допустимо, в противном случае void
value_type void
pointer void
reference void
iterator_category std::output_iterator_tag

В противном случае, у этого шаблона нет членов с такими именами (std::iterator_traits дружественен к SFINAE).

(с C++20)

Специализации

Этот тип-шаблон может быть специализирован для типов, предоставляемых пользователем, которые могут использоваться в качестве итераторов. Библиотека стандартных шаблонов предоставляет частичные специализации для типов указателей T*, что позволяет использовать все алгоритмы, основанные на итераторах, с сырыми указателями.

Библиотека стандартных шаблонов также предоставляет частичные специализации для некоторых адаптеров стандартных итераторов.

(с C++20)

Специализация типов-членов T*

Специализируется только если std::is_object_v<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

Специализация типов-членов const T*

Тип-член Определение
difference_type std::ptrdiff_t
value_type T
pointer const T*
reference const T&
iterator_category std::random_access_iterator_tag
(до C++20)

Специализации для типов библиотеки

std::iterator_traits<std::common_iterator>
(C++20)
предоставляет единый интерфейс к свойствам типа std::common_iterator
(специализация шаблона класса)
std::iterator_traits<std::counted_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

См. также

iterator
(устарело в C++17)
базовый класс для облегчения определения необходимых типов для простых итераторов
(шаблон класса)
input_iterator_tagoutput_iterator_tagforward_iterator_tagbidirectional_iterator_tagrandom_access_iterator_tagcontiguous_iterator_tag
(C++20)
пустые типы классов, используемые для обозначения категорий итераторов
(класс)
iter_value_titer_reference_titer_const_reference_titer_difference_titer_rvalue_reference_titer_common_reference_t
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API