Spec-Zone.ru › C++

Именованные требования C++: LegacyIterator

Требования LegacyIterator описывают типы, которые можно использовать для идентификации и обхода элементов контейнера.

LegacyIterator — это базовый набор требований, используемый другими типами итераторов: LegacyInputIterator, LegacyOutputIterator, LegacyForwardIterator, LegacyBidirectionalIterator и LegacyRandomAccessIterator. Итераторы можно рассматривать как абстракцию указателей.

Для всех категорий итераторов требуются только те функции, реализация которых для данной категории выполняется за постоянное время (амортизированно). Поэтому в таблицах требований и определениях концептов(начиная с 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 определяется следующий концепт, используемый только для описания.

template<class I>
concept __LegacyIterator =
    requires(I i)
    {
        {   *i } -> __Referenceable;
        {  ++i } -> std::same_as<I&>;
        { *i++ } -> __Referenceable;
    } && std::copyable<I>;

Концепт __Referenceable<T>, используемый только для описания, удовлетворяется тогда и только тогда, когда T& является допустимым типом (в частности, T не должен быть void).

(начиная с 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
  1. Категория LegacyContiguousIterator была официально определена только в C++17, однако итераторы std::vector, std::basic_string, std::array и std::valarray, а также указатели на элементы массивов C часто рассматривались как отдельная категория в коде, написанном до C++17.

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применён к Опубликованное поведение Корректное поведение
LWG 2437 C++98 *r должен быть reference не требуется для выходных итераторов
LWG 3420 C++20 концепт, используемый только для описания, сначала проверяет copyable copyable проверяется только в том случае, если requires-выражение возвращает true

См. также

input_or_output_iterator
(C++20)
задаёт требование, согласно которому объекты типа можно инкрементировать и разыменовывать
(концепт)
Библиотека итераторов предоставляет определения итераторов, характеристик итераторов, адаптеров и вспомогательных функций

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

Spec-Zone.ru

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