Spec-Zone.ru › C++

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 не требует, чтобы разыменование возвращало ссылку.

См. также

input_iterator
(C++20)
определяет, что тип является входным итератором, то есть его ссылочные значения могут быть прочитаны, и его можно как префиксно, так и постфиксно инкрементировать
(концепция)
bidirectional_iterator
(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

Spec-Zone.ru

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