Spec-Zone.ru › C++

std::bidirectional_iterator

Определено в заголовочном файле <iterator>
template< class I >
    concept bidirectional_iterator =
        std::forward_iterator<I> &&
        std::derived_from</*ITER_CONCEPT*/<I>, std::bidirectional_iterator_tag> &&
        requires(I i) {
            { --i } -> std::same_as<I&>;
            { i-- } -> std::same_as<I>;
        };
(с C++20)

Концепция bidirectional_iterator уточняет forward_iterator, добавив возможность перемещения итератора назад.

Определение концепции итератора

Определение этой концепции задано с помощью шаблона-псевдонима только для показа /*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> не обозначает тип и приводит к ошибке подстановки.

Семантические требования

Двунаправленный итератор r называется уменьшаемым тогда и только тогда, когда существует некоторый s такой, что ++s == r.

std::bidirectional_iterator<I> моделируется только если все подчинённые концепции моделируются, и даны два объекта a и b типа I:

  • Если a уменьшаем, a находится в области выражений --a и a--.
  • Предварительное уменьшение приводит к lvalue, которое ссылается на операнд: std::addressof(--a) == std::addressof(a).
  • Последующее уменьшение возвращает предыдущее значение операнда: если bool(a == b), то bool(a-- == b).
  • Последующее и предварительное уменьшение выполняют одну и ту же модификацию своего операнда: Если bool(a == b), то после оценки как a--, так и --b, bool(a == b) всё ещё выполняется.
  • Инкремент и декремент являются обратными друг другу:
    • Если a инкрементируемый и bool(a == b), то bool(--(++a) == b).
    • Если a уменьшаемый и bool(a == b), то bool(++(--a) == b).

Сохранение равенства

Выражения, объявленные в выражениях requires стандартных библиотек концепций, должны быть сохраняющими равенство (если не указано иное).

Примечания

В отличие от требований LegacyBidirectionalIterator, концепция bidirectional_iterator не требует, чтобы разыменование возвращало lvalue.

См. также

forward_iterator
(C++20)
определяет, что input_iterator является итератором вперёд, поддерживает сравнение на равенство и многопроходность
(концепция)
random_access_iterator
(C++20)
определяет, что bidirectional_iterator является итератором произвольного доступа, поддерживает продвижение за константное время и индексирование
(концепция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/bidirectional_iterator

Spec-Zone.ru

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