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.
См. также
|
(C++20) | определяет, что input_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