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.
См. также
|
(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