std::ranges::concat_view<Views...>::iterator
template< bool Const > class /*iterator*/ | (1) | (только для иллюстрации*) |
| Вспомогательные концепты | ||
template< bool Const, class... Rs > concept /*concat-is-random-access*/ = /* see description */; | (2) | (только для иллюстрации*) |
template< bool Const, class... Rs > concept /*concat-is-bidirectional*/ = /* see description */; | (3) | (только для иллюстрации*) |
iterator — это тип итераторов, возвращаемых функциями begin() и end() объекта ranges::concat_view<Views...>.Fs — пакет, состоящий из всех элементов Rs, кроме последнего. Эквивалентно template<boolConst,class...Rs>
concept concat-is-random-access =// exposition only
all-random-access <Const,Rs...>&&
(ranges::common_range<maybe-const <Const,Fs>>&&...);
.Fs — пакет, состоящий из всех элементов Rs, кроме последнего. Эквивалентно template<boolConst,class...Rs>
concept concat-is-bidirectional =// exposition only
all-bidirectional <Const,Rs...>&&
(ranges::common_range<maybe-const <Const,Fs>>&&...);
.Параметры шаблона
| Const | - | является ли итератор константным итератором |
Вложенные типы
Типы, используемые только для иллюстрации |
|
| Тип | Определение |
|---|---|
base-iter |
std::variant<ranges::iterator_t<maybe-const <Const,Views>>...>(тип-член, используемый только для иллюстрации*) |
Типы свойств итератора |
|
| Тип | Определение |
iterator_concept | тег итератора, см. ниже |
iterator_category(присутствует при определённых условиях) | тег итератора, см. ниже |
value_type |
concat-value-t <maybe-const <Const,Views>...> |
difference_type | std::common_type_t<ranges::range_difference_t< |
Определение концепта итератора
iterator_concept определяется следующим образом:
- Если удовлетворяется
concat-is-random-access <Const,Views...>,iterator_conceptобозначаетstd::random_access_iterator_tag. - Иначе, если удовлетворяется
concat-is-bidirectional <Const,Views...>,iterator_conceptобозначаетstd::bidirectional_iterator_tag. - Иначе, если удовлетворяется
all-forward <Const,Views...>,iterator_conceptобозначаетstd::forward_iterator_tag. - В противном случае
iterator_conceptобозначаетstd::input_iterator_tag.
Определение категории итератора
iterator_category определяется тогда и только тогда, когда удовлетворяется all-forward <Const,Views...>. В этом случае он определяется следующим образом:
- Если
std::is_reference_v<concat-reference-t <maybe-const <Const,Views>...>>— этоfalse,iterator_categoryобозначаетstd::input_iterator_tag. - Иначе пусть
Csобозначает пакет типов std::iterator_traits<ranges::iterator_t<maybe-const<Const,Views>>>::iterator_category...:- Если
(std::derived_from<Cs,std::random_access_iterator_tag>&&...)&&— это
concat-is-random-access <Const,Views...>true,iterator_categoryобозначаетstd::random_access_iterator_tag. - Иначе, если
(std::derived_from<Cs,std::bidirectional_iterator_tag>&&...)&&— это
concat-is-bidirectional <Const,Views...>true,iterator_categoryобозначаетstd::bidirectional_iterator_tag. - Иначе, если
(std::derived_from<Cs, std::forward_iterator_tag> && ...)— этоtrue,iterator_categoryобозначаетstd::forward_iterator_tag. - В противном случае
iterator_categoryобозначаетstd::input_iterator_tag.
- Если
Поля данных
| Поле | Описание |
|---|---|
maybe-const <Const,ranges::concat_view>* parent_ | указатель на родительский объект concat_view(объект-член, используемый только для иллюстрации*) |
base-iter it_ | итератор текущего представления (объект-член, используемый только для иллюстрации*) |
Функции-члены
| создаёт итератор (открытая функция-член) |
|
| получает доступ к элементу (открытая функция-член) |
|
| получает доступ к элементу по индексу (открытая функция-член) |
|
| перемещает базовый итератор вперёд или назад (открытая функция-член) |
|
Шаблоны функций, используемые только для иллюстрации |
|
заменяет it_ началом следующего представления, если it_ является концом текущего представления(функция-член, используемая только для иллюстрации*) |
|
перемещает it_ назад так, чтобы он указывал на предыдущую позицию(функция-член, используемая только для иллюстрации*) |
|
| перемещает текущую позицию на заданное смещение (функция-член, используемая только для иллюстрации*) |
|
| перемещает текущую позицию назад на заданную величину (функция-член, используемая только для иллюстрации*) |
|
Функции, не являющиеся членами
|
(C++26) | сравнивает базовые итераторы (функция) |
|
(C++26) | выполняет арифметические операции с итераторами (функция) |
|
(C++26) | приводит результат разыменования базового итератора к соответствующему ему типу rvalue-ссылки (функция) |
|
(C++26) | обменивает местами объекты, на которые указывают два базовых итератора (функция) |
Пример
Предварительную версию можно посмотреть в Compiler Explorer.
#include <iostream>
#include <iterator>
#include <ranges>
int main()
{
namespace views = std::views;
static constexpr int p[]{1, 2, 3};
static constexpr auto e = {4, 5};
auto t = views::iota(6, 9);
auto cat = views::concat(p, e, t);
auto dog = views::concat(cat, cat);
for (auto i{dog.begin()}; i != std::default_sentinel; ++i)
std::cout << *i << ' ';
std::cout << '\n';
}
Вывод:
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
Ссылки
- Стандарт C++26 (ISO/IEC 14882:2026):
- 26.7.18.3 Шаблон класса
concat_view::iterator[range.concat.iterator]
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/concat_view/iterator