Spec-Zone.ru › C++

std::contiguous_iterator

Определено в заголовке <iterator>
template< class I >
    concept contiguous_iterator =
        std::random_access_iterator<I> &&
        std::derived_from</*ITER_CONCEPT*/<I>, std::contiguous_iterator_tag> &&
        std::is_lvalue_reference_v<std::iter_reference_t<I>> &&
        std::same_as<
            std::iter_value_t<I>, std::remove_cvref_t<std::iter_reference_t<I>>
        > &&
        requires(const I& i) {
            { std::to_address(i) } ->
              std::same_as<std::add_pointer_t<std::iter_reference_t<I>>>;
        };
(с C++20)

Концепция contiguous_iterator уточняет random_access_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> не обозначает тип и приводит к ошибке подстановки.

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

Пусть a и b являются допустимыми для разыменования итераторами, а c - недопустимым для разыменования итератором типа I, таким образом, что b достижим из a и c достижим из b. Тип I моделирует contiguous_iterator только если все подразумеваемые концепции моделируются и:

  • std::to_address(a) == std::addressof(*a),
  • std::to_address(b) == std::to_address(a) + std::iter_difference_t<I>(b - a), и
  • std::to_address(c) == std::to_address(a) + std::iter_difference_t<I>(c - a).

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

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

Варианты неявных выражений

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

Примечания

contiguous_iterator моделируется каждым указателем на тип полного объекта.

Типы итераторов в стандартной библиотеке, которые должны удовлетворять требованиям LegacyContiguousIterator в C++17, также должны моделировать contiguous_iterator в C++20.

См. также

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/contiguous_iterator

Spec-Zone.ru

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