Spec-Zone.ru › C++

std::input_iterator

Определён в заголовочном файле <iterator>
template< class I >
    concept input_iterator =
        std::input_or_output_iterator<I> &&
        std::indirectly_readable<I> &&
        requires { typename /*ITER_CONCEPT*/<I>; } &&
        std::derived_from</*ITER_CONCEPT*/<I>, std::input_iterator_tag>;
(начиная с C++20)

Концепция input_iterator является уточнением input_or_output_iterator, добавляя требование, что на значения, на которые ссылаются, можно читать (через indirectly_readable), и требование наличия тега концепции итератора.

Определение концепции итератора

Определение этой концепции задаётся с помощью шаблона псевдонима /*ITER_CONCEPT*/, предназначенного только для описания.

Чтобы определить /*ITER_CONCEPT*/<I>, пусть ITER_TRAITS<I> обозначает I, если специализация std::iterator_traits<I> создана из основного шаблона, и std::iterator_traits<I> в противном случае:

  • Если ITER_TRAITS<I>::iterator_concept корректно и обозначает тип, /*ITER_CONCEPT*/<I> обозначает этот тип.
  • В противном случае, если ITER_TRAITS<I>::iterator_category корректно и обозначает тип, /*ITER_CONCEPT*/<I> обозначает этот тип.
  • В противном случае, если std::iterator_traits<I> создана из основного шаблона, /*ITER_CONCEPT*/<I> обозначает std::random_access_iterator_tag.
    (То есть предполагается, что std::derived_from</*ITER_CONCEPT*/<I>, std::input_iterator_tag> — это true.)
  • В противном случае /*ITER_CONCEPT*/<I> не обозначает тип и приводит к сбою подстановки.

Примечания

В отличие от требований LegacyInputIterator, концепция input_iterator не требует equality_comparable, поскольку входные итераторы обычно сравниваются с сентинелами.

Пример

Минимальный входной итератор.

#include <cstddef>
#include <iterator>

struct SimpleInputIterator
{
    using difference_type = std::ptrdiff_t;
    using value_type = int;

    int operator*() const;

    SimpleInputIterator& operator++();
    void operator++(int) { ++*this; }
};

static_assert(std::input_iterator<SimpleInputIterator>);

См. также

input_or_output_iterator
(C++20)
задаёт, что объекты типа можно инкрементировать и разыменовывать
(концепция)
forward_iterator
(C++20)
задаёт, что input_iterator является прямым итератором, поддерживающим сравнение на равенство и многократный проход
(концепция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/input_iterator

Spec-Zone.ru

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