Требования к именованным итераторам C++: LegacyForwardIterator
LegacyForwardIterator — это LegacyIterator, который позволяет считывать данные из указанного элемента.
В отличие от LegacyInputIterator и LegacyOutputIterator, его можно использовать в многопроходных алгоритмах.
Если LegacyForwardIterator it происходит из Container, то it его value_type совпадает с контейнером, поэтому при обращении (*it) получается value_type контейнера.
Требования
Тип It соответствует LegacyForwardIterator, если
- Тип
ItсоответствуетLegacyInputIterator - Тип
ItсоответствуетDefaultConstructible - Объекты типа
Itобеспечивают гарантию многократного прохода, описанную ниже - Пусть
T— тип значенияIt. Тип std::iterator_traits<It>::reference должен быть либо
-
-
T&илиT&&(с C++11) еслиItсоответствуетLegacyOutputIterator(It— изменяемый), или -
constT& илиconst T&&(с C++11) в противном случае (It— постоянный),
-
- (где
T— тип, обозначаемый std::iterator_traits<It>::value_type)
- Сравнение на равенство и неравенство определено для всех итераторов одной и той же основной последовательности и для итераторов, инициализированных значением(с C++14).
И, учитывая
-
i, разрешаемое lvalue типаIt -
reference, тип, обозначаемый std::iterator_traits<It>::reference
Следующие выражения должны быть допустимы и иметь указанные эффекты
| Выражение | Тип возвращаемого значения | Эквивалентное выражение |
|---|---|---|
i++ |
It |
It ip = i; ++i; return ip; |
*i++ |
reference |
Изменяемый LegacyForwardIterator — это LegacyForwardIterator, который дополнительно удовлетворяет требованиям LegacyOutputIterator.
Гарантия многократного прохода
Учитывая a и b, разрешаемые итераторы типа It:
- Если
aиbравны (a == bконтекстуально преобразуется вtrue) , то либо они оба неразрешаемые, либо*aи*bявляются ссылками, привязанными к одному объекту. - Если
*aи*bссылаются на один и тот же объект, тоa == b. - Присваивание через изменяемый
ForwardIteratorитератор не может сделать итератор недействительным (явный, так какreferenceопределен как ссылка). - Инкрементирование копии
aне изменяет значение, считанное изa(формально, либоIt— тип сырой указателя, либо выражение(void)++It(a), *aэквивалентно выражению*a). -
a == bподразумевает++a == ++b.
Итераторы-исключенияИнициализированный значениемLegacyForwardIterator ведет себя как итератор "после конца" некоторого неопределенного пустого контейнера: он сравнивается с любым другими инициализированными значением LegacyForwardIterator того же типа.
|
(с C++14) |
КонцепцияДля определения
где концепция, предназначенная только для пояснения |
(с C++20) |
Примечания
В отличие от концепции std::forward_iterator, требования LegacyForwardIterator требуют, чтобы обращение возвращало ссылку.
Отчеты об ошибках
Следующие исправляющие ошибки отчеты были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение, опубликованное | Правильное поведение |
|---|---|---|---|
|
LWG 1212 (N3066) |
C++98 | тип возвращаемого значения *i++ не соответствовал типу возвращаемогозначения *i-- , требуемому LegacyBidirectionalIterator |
изменен тип возвращаемого значения на reference |
|
LWG 1311 (N3066) |
C++98 | 'a == b подразумевает ++a == ++b' не гарантирует многопроходность[1] |
также требуется 'a == b подразумевает ++a != b'[2] |
| LWG 3798 | C++20 |
__LegacyForwardIterator требуетсяstd::iter_reference_t<It> быть типом ссылки lvalue |
также допускаются типы ссылок rvalue |
-
В сценарии, где
aиbиспользуют один и тот же базовый итератор, вычисление выражения++a == ++bфактически дважды инкрементирует базовый контейнер, но результат по-прежнемуtrue. -
Формально также требует подразумевания
++b != a.
См. также
|
(C++20)
|
уточняет, что input_iterator является итератором прямого доступа, поддерживает сравнение на равенство и многопроходность (концепция) |
| Библиотека итераторов | предоставляет определения для итераторов, свойств итераторов, адаптеров и вспомогательных функций |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/named_req/ForwardIterator