Namespaces
Variants

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 — это объект точки настройки.
3) Определяет, является ли cartesian_product диапазоном произвольного доступа (см. также random_access_range).
4) Определяет, является ли cartesian_product общим диапазоном (см. также common_range).
5) Определяет, является ли cartesian_product двунаправленным диапазоном (см. также bidirectional_range).
6) Определяет, удовлетворяет ли cartesian_product вспомогательному концепту /*cartesian-product-is-common*/ (см. также common_range).
7) Определяет, является ли cartesian_product диапазоном с размером (см. также sized_range).
8) Определяет, использует ли cartesian_product дозорный с размером.
9) Возвращает конец порождённого представления. Участвует в разрешении перегрузки, только если cartesian_product удовлетворяет вспомогательному концепту /*cartesian-product-common-arg*/.

First Диапазон, переданный в cartesian_product_view, обрабатывается особым образом, поскольку он передаётся только один раз. Как следствие, для него ослаблены некоторые ограничения:

Объекты точек настройки

Имя 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]

Смотрите также

представление, view состоящее из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект точки кастомизации)