std::ranges:: views:: concat, std::ranges:: concat_view
|
Определено в заголовке
<ranges>
|
||
|
template
<
ranges::
input_range
...
Views
>
requires
(
ranges::
view
<
Views
>
&&
...
)
&&
(
sizeof...
(
Views
)
>
0
)
&&
|
(1) | (начиная с C++26) |
|
namespace
views
{
inline
constexpr
/* unspecified */
concat
=
/* unspecified */
;
|
(2) | (начиная с C++26) |
|
Сигнатура вызова
|
||
|
template
<
ranges::
viewable_range
...
Rs
>
требует
/* см. ниже */
|
(начиная с C++26) | |
|
Вспомогательные псевдонимы типов
|
||
|
template
<
class
...
Rs
>
using
/*concat-reference-t*/
=
|
(3) | ( только для демонстрации* ) |
|
template
<
class
...
Rs
>
using /*concat-value-t*/ = std:: common_type_t < ranges:: range_value_t < Rs > ... > ; |
(4) | ( только для демонстрации* ) |
|
template
<
class
...
Rs
>
using
/*concat-rvalue-reference-t*/
=
|
(5) | ( только для демонстрации* ) |
|
Вспомогательные концепции
|
||
|
template
<
class
Ref,
class
RRef,
class
It
>
concept /*concat-indirectly-readable-impl*/ = /* see description */ ; |
(6) | ( только для демонстрации* ) |
|
template
<
class
...
Rs
>
concept /*concatable*/ = /* см. описание */ ; |
(7) | ( только для демонстрации* ) |
concat_view
представляет
view
фабрику, которая принимает произвольное количество диапазонов в качестве списка аргументов и предоставляет представление, начинающееся с первого элемента первого диапазона, заканчивающееся последним элементом последнего диапазона, со всеми элементами диапазонов, последовательно расположенными между ними в порядке, заданном в аргументах, эффективно объединяя или связывая вместе аргументные диапазоны.
view
s
, каждый из которых моделирует как минимум
input_range
и является
concatable
(7)
.
views::concat
является объектом точки кастомизации.
Для набора подвыражений exprs , выражение views :: concat ( exprs... ) является эквивалентным выражением для
-
views::
all
(
exprs...
)
если
exprs
является набором с единственным элементом, тип которого моделирует
input_range, - concat_view ( exprs... ) в противном случае.
iterator
::value_type
, который дополнительно учитывает
value_type
базовых диапазонов для поддержки случаев, когда базовые диапазоны имеют прокси-итераторы.
iter_move
.
indirectly-readable
для
iterator
таким образом, чтобы
concat_view
мог моделировать
input_range
.
template< class... Rs > concept /*concat-indirectly-readable*/ = // только для пояснения std::common_reference_with</*concat-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...>&> && std::common_reference_with</*concat-reference-t*/<Rs...>&&, /*concat-rvalue-reference-t*/<Rs...>&&> && std::common_reference_with</*concat-rvalue-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...> const&> && (/*concat-indirectly-readable-impl*/</*concat-reference-t*/<Rs...>, /*concat-rvalue-reference-t*/<Rs...>, ranges::iterator_t<Rs>> && ...);
template< class Ref, class RRef, class It > concept /*concat-indirectly-readable-impl*/ = // exposition only requires(const It it) { { *it } -> std::convertible_to<Ref>; { ranges::iter_move(it)} -> std::convertible_to<RRef>; };
template< class... Rs > concept /*concatable*/ = requires { // exposition only typename /*concat-reference-t*/<Rs...>; typename /*concat-value-t*/<Rs...>; typename /*concat-rvalue-reference-t*/<Rs...>; } && /*concat-indirectly-readable*/<Rs...>;
concat_view
всегда моделирует
input_range
и моделирует
forward_range
,
bidirectional_range
,
random_access_range
или
sized_range
если каждый адаптированный
view
тип моделирует соответствующую концепцию.
concat_view
может быть
common_range
если последний базовый диапазон моделирует
common_range
.
Содержание |
Объекты точек кастомизации
Имя
views::concat
обозначает
объект точки кастомизации
, который является константным
функциональным объектом
типа
литерального
semiregular
класса. Для подробностей см.
CustomizationPointObject
.
Члены данных
| Участник | Описание |
std::
tuple
<
Views...
>
views_
|
все адаптированные объекты представлений
( объект-участник только для демонстрации* ) |
Функции-члены
создаёт
concat_view
(публичная функция-член) |
|
|
возвращает итератор на начало
(публичная функция-член) |
|
|
возвращает итератор или страж на конец
(публичная функция-член) |
|
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет
sized_range
(публичная функция-член) |
|
Унаследовано от std::ranges::view_interface |
|
возвращает, является ли производное представление пустым, предоставляется только если оно удовлетворяет
sized_range
или
forward_range
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
|
(C++23)
|
возвращает константный итератор на начало диапазона
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
(C++23)
|
возвращает страж для константного итератора диапазона
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
возвращает, является ли производное представление непустым, предоставляется только если
ranges::empty
применимо к нему
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
возвращает первый элемент в производном представлении, предоставляется если оно удовлетворяет
forward_range
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
возвращает последний элемент в производном представлении, предоставляется только если оно удовлетворяет
bidirectional_range
и
common_range
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
возвращает
n
-й
элемент в производном представлении, предоставляется только если оно удовлетворяет
random_access_range
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
Руководства по выводу
Вложенные классы
| Название класса | Определение |
|
тип итератора
( демонстрационный шаблон класса-члена* ) |
Вспомогательные шаблоны
Не существует специализации
ranges::
enable_borrowed_range
для
concat_view
, поскольку это потребовало бы, чтобы реализация итератора содержала копию всех итераторов и стражей всех базовых диапазонов постоянно.
Примечания
Вызов без аргументов
views
::
concat
(
)
является некорректным, поскольку не существует разумного способа определить тип элемента
T
. Вызов с одним аргументом
views
::
concat
(
r
)
эквивалентен выражению
views::
all
(
r
)
.
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_ranges_concat
|
202403L
|
(C++26) |
std::ranges::concat_view
|
Пример
Предварительную версию можно посмотреть на Compiler Explorer .
#include <cassert> #include <list> #include <print> #include <ranges> #include <vector> int main() { std::vector<int> v0{1, 2, 3}, v1{4, 5}; int a[]{6, 7}; int i{8}; auto ie{std::views::single(i)}; auto con = std::views::concat(v0, v1, a, ie); assert(con.size() == v0.size() + v1.size() + std::size(a) + ie.size()); std::println("con.size(): {}", con.size()); std::println("con: {}", con); con[6] = 42; // con is random_access_range, operator[] returns a reference assert(a[1] == 42); // a[1] was modified via con[6] std::println("con: {}", con); std::list<int> l{7, 8}; // list is bidirectional range auto cat = std::views::concat(v0, l); std::println("cat: {}", cat); // cat[0] = 13; // compile-time error: cat is bidirectional => no operator[] }
Вывод:
con.size(): 8 con: [1, 2, 3, 4, 5, 6, 7, 8] con: [1, 2, 3, 4, 5, 6, 42, 8] cat: [1, 2, 3, 7, 8]
Ссылки
- Стандарт C++26 (ISO/IEC 14882:2026):
-
- 26.7.18 Представление конкатенации [range.concat]
Смотрите также
|
(C++20)
|
view
состоящий из последовательности, полученной путём выравнивания
view
из
range
s
(шаблон класса) (объект адаптера диапазона) |
view
состоящий из последовательности, полученной путём выравнивания view диапазонов, с разделителем между элементами
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++23)
|
view
состоящий из кортежей ссылок на соответствующие элементы адаптированных views
(шаблон класса) (объект точки настройки) |
view
состоящий из кортежей результатов, вычисленных n-арным декартовым произведением адаптированных views
(шаблон класса) (объект точки настройки) |