std::input_or_output_iterator
Определён в заголовочном файле <iterator> | ||
|---|---|---|
template< class I >
concept input_or_output_iterator =
requires(I i) {
{ *i } -> /*can-reference*/;
} &&
std::weakly_incrementable<I>;
| (начиная с C++20) |
Концепция input_or_output_iterator лежит в основе таксономии концепций итераторов; каждый тип итератора удовлетворяет требованиям input_or_output_iterator.
Концепция, используемая только для описания, /*can-reference*/ удовлетворяется тогда и только тогда, когда тип не является (возможно, cv-квалифицированным) void.
Примечания
Сама концепция input_or_output_iterator задаёт только операции разыменования и инкремента итератора. Большинству алгоритмов потребуются дополнительные операции, например:
- сравнение итераторов с сентинелами (см.
sentinel_for); - чтение значений из итератора (см.
indirectly_readableиinput_iterator); - запись значений в итератор (см.
indirectly_writableиoutput_iterator); - более широкий набор перемещений итератора (см.
forward_iterator,bidirectional_iterator,random_access_iterator).
В отличие от требований LegacyIterator, концепция input_or_output_iterator не требует возможности копирования.
*i должен сохранять равенство, хотя операции инкремента, требуемые концепцией weakly_incrementable, этого не требуют.
Пример
Минимальный итератор.
#include <cstddef>
#include <iterator>
struct SimpleIterator
{
using difference_type = std::ptrdiff_t;
int operator*();
SimpleIterator& operator++();
void operator++(int) { ++*this; }
};
static_assert(std::input_or_output_iterator<SimpleIterator>);
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/input_or_output_iterator