Namespaces
Variants

std:: input_iterator

From cppreference.net
Iterator library
Iterator concepts
input_iterator
(C++20)

Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
Определено в заголовочном файле <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 , поскольку input iterators обычно сравниваются с sentinels.

Пример

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

#include <cstddef>
#include <iterator>
class SimpleInputIterator
{
public:
    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>);
**Примечание:** Весь код C++ внутри тегов `
` и `` оставлен без изменений, как и требовалось. HTML-теги и атрибуты также сохранены в оригинальном виде.

Смотрите также

определяет, что объекты типа могут быть инкрементированы и разыменованы
(concept)
определяет, что input_iterator является прямым итератором, поддерживающим сравнение на равенство и многопроходность
(concept)