std::ranges::views::cartesian_product, std::ranges::cartesian_product_view
С ru.cppreference.net
| Определён в заголовке <ranges>
|
||
template< ranges::input_range First, ranges::forward_range... Vs >
requires (ranges::view<First> && ... && ranges::view<Vs>)
class cartesian_product_view
: public ranges::view_interface<cartesian_product_view<First, Vs...>>
|
(1) | (начиная с C++23) |
namespace views {
inline constexpr /*unspecified*/ cartesian_product = /*unspecified*/;
}
|
(2) | (начиная с C++23) |
| Сигнатура вызова |
||
template< ranges::viewable_range... Rs >
requires /* see below */
constexpr ranges::view auto cartesian_product( Rs&&... rs );
|
(начиная с C++23) | |
| Вспомогательные концепции |
||
template< bool Const, class First, class... Vs >
concept /*cartesian-product-is-random-access*/ =
(ranges::random_access_range</*maybe-const*/<Const, First>> && ... &&
(ranges::random_access_range</*maybe-const*/<Const, Vs>> &&
ranges::sized_range</*maybe-const*/<Const, Vs>>));
|
(3) | (только для демонстрации*) |
template< class R >
concept /*cartesian-product-common-arg*/ =
ranges::common_range<R> ||
(ranges::sized_range<R> && ranges::random_access_range<R>);
|
(4) | (только для демонстрации*) |
template< bool Const, class First, class... Vs >
concept /*cartesian-product-is-bidirectional*/ =
(ranges::bidirectional_range</*maybe-const*/<Const, First>> && ... &&
(ranges::bidirectional_range</*maybe-const*/<Const, Vs>> &&
/*cartesian-product-common-arg*/</*maybe-const*/<Const, Vs>>));
|
(5) | (только для демонстрации*) |
template< class First, class... Vs >
concept /*cartesian-product-is-common*/ =
/*cartesian-product-common-arg*/<First>;
|
(6) | (только для демонстрации*) |
template< class... Vs >
concept /*cartesian-product-is-sized*/ =
(ranges::sized_range<Vs> && ...);
|
(7) | (только для демонстрации*) |
template< bool Const, template<class> class FirstSent, class First, class... Vs >
concept /*cartesian-is-sized-sentinel*/ =
(std::sized_sentinel_for<FirstSent</*maybe-const*/<Const, First>>,
ranges::iterator_t</*maybe-const*/<Const, First>>> && ... &&
(ranges::sized_range</*maybe-const*/<Const, Vs>> &&
std::sized_sentinel_for<ranges::iterator_t<
/*maybe-const*/<Const, Vs>>,
ranges::iterator_t</*maybe-const*/<Const, Vs>>>));
|
(8) | (только для демонстрации*) |
| Вспомогательные шаблоны функций |
||
template< /*cartesian-product-common-arg*/ R >
constexpr auto /*cartesian-common-arg-end*/( R& r )
{
if constexpr (ranges::common_range<R>)
return ranges::end(r);
else
return ranges::begin(r) + ranges::distance(r);
}
|
(9) | (только для демонстрации*) |
1)
cartesian_product_view — это адаптер диапазонов, который принимает n представлений (view), где n > 0, и порождает представление кортежей, вычисляемых как n-арное декартово произведение предоставленных диапазонов. Размер порождённого представления является произведением размеров предоставленных диапазонов, при этом каждый элемент является кортежем (из ссылок) размера n.2)
views::cartesian_product — это объект точки настройки.
- При вызове без аргументов
views::cartesian_product()является эквивалентным по выражению выражениюviews::single(std::tuple()). - В противном случае
views::cartesian_product(rs...)является эквивалентным по выражению выражениюranges::cartesian_product_view<views::all_t<decltype((rs))>...>(rs...).
3) Определяет, является ли
cartesian_product диапазоном произвольного доступа (см. также random_access_range).5) Определяет, является ли
cartesian_product двунаправленным диапазоном (см. также bidirectional_range).6) Определяет, удовлетворяет ли
cartesian_product вспомогательному концепту /*cartesian-product-is-common*/ (см. также common_range).8) Определяет, использует ли
cartesian_product дозорный с размером.9) Возвращает конец порождённого представления. Участвует в разрешении перегрузки, только если
cartesian_product удовлетворяет вспомогательному концепту /*cartesian-product-common-arg*/.First Диапазон, переданный в 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
(публичная функция-член) |
|
Унаследовано от 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
состоящее из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект точки кастомизации) |