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>);
См. также
|
(C++20) | задаёт, что объекты типа можно инкрементировать и разыменовывать (концепция) |
|
(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