std::ranges:: views:: cartesian_product, std::ranges:: cartesian_product_view
|
Определено в заголовке
<ranges>
|
||
|
template
<
ranges::
input_range
First,
ranges::
forward_range
...
Vs
>
requires
(
ranges::
view
<
First
>
&&
...
&&
ranges::
view
<
Vs
>
)
|
(1) | (начиная с C++23) |
|
namespace
views
{
inline
constexpr
/*unspecified*/
cartesian_product
=
/*unspecified*/
;
|
(2) | (начиная с C++23) |
|
Сигнатура вызова
|
||
|
template
<
ranges::
viewable_range
...
Rs
>
requires
/* см. ниже */
|
(начиная с C++23) | |
|
Вспомогательные концепции
|
||
|
template
<
bool
Const,
class
First,
class
...
Vs
>
concept
/*cartesian-product-is-random-access*/
=
|
(3) | ( только для демонстрации* ) |
|
template
<
class
R
>
concept
/*cartesian-product-common-arg*/
=
|
(4) | ( только для демонстрации* ) |
|
template
<
bool
Const,
class
First,
class
...
Vs
>
concept
/*cartesian-product-is-bidirectional*/
=
|
(5) | ( только для демонстрации* ) |
|
template
<
class
First,
class
...
Vs
>
concept
/*cartesian-product-is-common*/
=
|
(6) | ( только для демонстрации* ) |
|
template
<
class
...
Vs
>
concept
/*cartesian-product-is-sized*/
=
|
(7) | ( только для демонстрации* ) |
|
template
<
bool
Const,
template
<
class
>
class
FirstSent,
class
First,
class
...
Vs
>
концепт
/*cartesian-is-sized-sentinel*/
=
|
(8) | ( только для демонстрации* ) |
|
Вспомогательные шаблоны функций
|
||
|
template
<
/*cartesian-product-common-arg*/
R
>
constexpr
auto
/*cartesian-common-arg-end*/
(
R
&
r
)
|
(9) | ( только для демонстрации* ) |
cartesian_product_view
— это адаптер диапазонов, который принимает
n
view
s
, где
n > 0
, и создаёт
view
кортежей, вычисляемых с помощью
n-арного декартова произведения
предоставленных диапазонов. Размер создаваемого представления кратен размерам предоставленных диапазонов, при этом каждый элемент является кортежем (ссылок) размера
n
.
views::cartesian_product
является объектом точки кастомизации.
- При вызове без аргументов, views :: cartesian_product ( ) является эквивалентным по выражению выражению views:: single ( std:: tuple ( ) ) .
- В противном случае, views :: cartesian_product ( rs... ) является эквивалентным по выражению выражению ranges :: cartesian_product_view < views:: all_t < decltype ( ( rs ) ) > ... > ( rs... ) .
cartesian_product
диапазоном с произвольным доступом (см. также
random_access_range
).
cartesian_product
двунаправленным диапазоном (см. также
bidirectional_range
).
cartesian_product
вспомогательному концепту
/*cartesian-product-is-common*/
(см. также
common_range
).
cartesian_product
размеченный ограничитель.
view
. Участвует в разрешении перегрузки только если
cartesian_product
удовлетворяет вспомогательной концепции
/*cartesian-product-common-arg*/
.
Первый
First
range
переданный в
cartesian_product_view
обрабатывается особым образом, так как он передается только один раз. В результате некоторые ограничения для него ослаблены:
-
Firstявляетсяinput_rangeвместоforward_range; -
Firstне обязательно должен бытьsized_rangeдля того, чтобыcartesian_product_viewбылrandom_access_rangeилиcommon_range; -
Firstне обязательно должен бытьcommon_rangeдля того, чтобыcartesian_product_viewбылbidirectional_range.
Содержание |
Объекты точек настройки
Имя
views::cartesian_product
обозначает
объект точки кастомизации
, который является константным
функциональным объектом
типа
литерального
semiregular
класса. Для подробностей см.
CustomizationPointObject
.
Члены данных
| Участник | Определение |
std::
tuple
<
First, Vs...
>
base_
(приватный)
|
Объект, содержащий все адаптированные
view
объекты.
( объект-участник только для демонстрации* ) |
Функции-члены
создает
cartesian_product_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>
)
|
|
Руководства по выводу
Вложенные классы
|
тип итератора
( демонстрационный шаблон класса-члена* ) |
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_ranges_cartesian_product
|
202207L
|
(C++23) |
std::ranges::cartesian_product_view
|
Пример
#include <array> #include <iostream> #include <list> #include <ranges> #include <string> #include <vector> void print(std::tuple<char const&, int const&, std::string const&> t, int pos) { const auto& [a, b, c] = t; std::cout << '(' << a << ' ' << b << ' ' << c << ')' << (pos % 4 ? " " : "\n"); } int main() { const auto x = std::array{'A', 'B'}; const auto y = std::vector{1, 2, 3}; const auto z = std::list<std::string>{"α", "β", "γ", "δ"}; for (int i{1}; auto const& tuple : std::views::cartesian_product(x, y, z)) print(tuple, i++); }
Вывод:
(A 1 α) (A 1 β) (A 1 γ) (A 1 δ) (A 2 α) (A 2 β) (A 2 γ) (A 2 δ) (A 3 α) (A 3 β) (A 3 γ) (A 3 δ) (B 1 α) (B 1 β) (B 1 γ) (B 1 δ) (B 2 α) (B 2 β) (B 2 γ) (B 2 δ) (B 3 α) (B 3 β) (B 3 γ) (B 3 δ)
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
-
- 26.7.31 Представление декартова произведения [range.stride]
Смотрите также
|
(C++23)
|
представление,
view
состоящее из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект точки кастомизации) |