std::forward_iterator
Определено в заголовке <iterator> | ||
|---|---|---|
template< class I >
concept forward_iterator =
std::input_iterator<I> &&
std::derived_from</*ITER_CONCEPT*/<I>, std::forward_iterator_tag> &&
std::incrementable<I> &&
std::sentinel_for<I, I>;
| (с C++20) |
Этот концепция уточняет std::input_iterator , потребовав, чтобы I также моделировал std::incrementable (что делает его подходящим для многопроходных алгоритмов) и гарантируя, что два итератора одного и того же диапазона могут быть сравнены друг с другом.
Определение концепции итератора
Определение этой концепции задаётся через шаблон-псевдоним /*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. - В противном случае,
/*ITER_CONCEPT*/<I>не обозначает тип и приводит к ошибке подстановки.
Семантические требования
I моделирует std::forward_iterator тогда и только тогда, когда I моделирует все подчинённые концепции, и с объектами i и j типа I.
- Сравнение итераторов
iиjимеет определённый результат, если -
iиjявляются итераторами к одной и той же базовой последовательности, или - оба
iиjинициализированы значениями по умолчанию, в этом случае они сравниваются как равные. - Указатели и ссылки, полученные от forward-итератора в диапазон, остаются действительными до тех пор, пока существует этот диапазон.
- Если
iиjявляются разыменовываемыми, они обеспечивают гарантию многократного прохода, то есть: -
i == jподразумевает++i == ++j, и -
((void)[](auto x){ ++x; }(i), *i)эквивалентно*i.
Примечания
В отличие от требований LegacyForwardIterator, концепция forward_iterator не требует, чтобы разыменование возвращало ссылку.
См. также
|
(C++20) | определяет, что тип является входным итератором, то есть его ссылочные значения могут быть прочитаны, и его можно как префиксно, так и постфиксно инкрементировать (концепция) |
|
(C++20) | определяет, что forward_iterator является двунаправленным итератором, поддерживающим обратное перемещение (концепция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/forward_iterator