C++ named requirements: LegacyIterator
Требования LegacyIterator описывают типы, которые могут использоваться для идентификации и обхода элементов контейнера.
LegacyIterator — это базовый набор требований, используемый другими типами итераторов: LegacyInputIterator , LegacyOutputIterator , LegacyForwardIterator , LegacyBidirectionalIterator и LegacyRandomAccessIterator . Итераторы можно рассматривать как абстракцию указателей.
Все категории итераторов требуют только тех функций, которые реализуемы для данной категории за постоянное время (амортизированное). Поэтому таблицы требований и определения концепций (since C++20) для итераторов не специфицируют сложность.
Содержание |
Требования
Тип
It
удовлетворяет
LegacyIterator
если
-
Тип
Itудовлетворяет требованиям CopyConstructible , и -
Тип
Itудовлетворяет требованиям CopyAssignable , и -
Тип
Itудовлетворяет требованиям Destructible , и -
Тип
Itудовлетворяет требованиям Swappable , и -
std::
iterator_traits
<
It
>
имеет члены-типы:
value_type, (до C++20)difference_type,reference,pointer, иiterator_category, и -
Для
r
, lvalue типа
It, следующие выражения должны быть корректны и иметь указанные эффекты:
| Выражение | Тип возвращаемого значения | Предусловие |
|---|---|---|
| * r | неопределён | r является разыменовываемым |
| ++ r | It & | r является инкрементируемым (поведение выражения ++ r определено) |
КонцептДля определения std::iterator_traits определяется следующий концепт, используемый только для демонстрации.
где концепт, используемый только для демонстрации
__Referenceable
<
T
>
удовлетворяется тогда и только тогда, когда
T
&
является допустимым типом (в частности,
|
(начиная с C++20) |
Примечания
Примечание по терминологии: следующая таблица показывает названия, используемые на этом сайте, и соответствующие названия из стандарта C++ (с тем же значением). Префикс "Legacy" (и «Cpp17») подчеркивает совместимость со стандартами до C++20 и используется для отличия этих требований от новых концепций итераторов введенных в C++20.
| названия cppreference | названия стандарта C++ | концепции итераторов C++20 |
|---|---|---|
| LegacyIterator |
Cpp17Iterator
|
input_or_output_iterator
|
| LegacyInputIterator |
Cpp17InputIterator
|
input_iterator
|
| LegacyOutputIterator |
Cpp17OutputIterator
|
output_iterator
|
| LegacyForwardIterator |
Cpp17ForwardIterator
|
forward_iterator
|
| LegacyBidirectionalIterator |
Cpp17BidirectionalIterator
|
bidirectional_iterator
|
| LegacyRandomAccessIterator |
Cpp17RandomAccessIterator
|
random_access_iterator
|
| LegacyContiguousIterator [1] |
contiguous_iterator
|
- ↑ LegacyContiguousIterator категория была формально определена только в C++17, однако итераторы std::vector , std::basic_string , std::array и std::valarray , а также указатели на массивы C часто рассматривались как отдельная категория в коде до C++17.
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 2437 | C++98 |
*
r
требуется, чтобы был
reference
|
не требуется для output iterators |
| LWG 3420 | C++20 |
экспозиционная концепция проверяет
copyable
сначала
|
copyable
проверяется только если requires-expression возвращает true
|
Смотрите также
|
(C++20)
|
определяет, что объекты типа могут быть инкрементированы и разыменованы
(концепт) |
| Iterator library | предоставляет определения для итераторов, характеристик итераторов, адаптеров и служебных функций |