Spec-Zone.ru › C++

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>)
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 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 =
    (ranges::sized_sentinel_for<FirstSent<__maybe_const<Const, First>>,
        ranges::iterator_t<__maybe_const<Const, First>>> && ... &&
            (ranges::sized_range<__maybe_const<Const, Vs>> &&
                ranges::sized_sentinel_for<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, и создаёт view кортежей, вычисленных по 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).
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) Возвращает конец созданного view. Участвует в разрешении перегрузки только если cartesian_product удовлетворяет вспомогательной концепции __cartesian_product_common_arg.

Диапазон 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 класса типов. Для наглядности, неквалифицированная версия его типа обозначается как __cartesian_product_fn.

Все экземпляры __cartesian_product_fn равны. Эффекты вызова различных экземпляров типа __cartesian_product_fn с одними и теми же аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и квалифицировано ли оно как const (хотя экземпляр, квалифицированный как volatile, не обязан быть вызываемым). Таким образом, views::cartesian_product можно свободно копировать, и его копии можно использовать взаимозаменяемо.

Учитывая набор типов Args..., если std::declval<Args>()... удовлетворяют требованиям аргументов для views::cartesian_product выше, __cartesian_product_fn моделирует

  • std::invocable<__cartesian_product_fn, Args...>,
  • std::invocable<const __cartesian_product_fn, Args...>,
  • std::invocable<__cartesian_product_fn&, Args...>, и
  • std::invocable<const __cartesian_product_fn&, Args...>.

В противном случае, никакой оператор вызова функции __cartesian_product_fn не участвует в разрешении перегрузки.

Члены данных

Член объекта Определение
base_ (private) Объект типа std::tuple<First, Vs...>, который хранит все адаптированные view объекты.
(только для иллюстрации*)

Члены-функции

(конструктор)
(C++23)
создаёт cartesian_product_view
(открытый член-функция)
begin
(C++23)
возвращает итератор начала
(открытый член-функция)
end
(C++23)
возвращает итератор или стоп-итератор конца
(открытый член-функция)
size
(C++23)
возвращает количество элементов. Доступно только если исходный (адаптированный) диапазон удовлетворяет sized_range.
(открытый член-функция)
Унаследовано от std::ranges::view_interface
empty
(C++20)
возвращает пуст ли производный вид. Доступно если он удовлетворяет sized_range или forward_range.
(открытый член-функция std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор начала диапазона.
(открытый член-функция std::ranges::view_interface<D>)
cend
(C++23)
возвращает стоп-итератор константного итератора диапазона.
(открытый член-функция std::ranges::view_interface<D>)
operator bool
(C++20)
возвращает не пуст ли производный вид. Доступно если ranges::empty применимо к нему.
(открытый член-функция std::ranges::view_interface<D>)
front
(C++20)
возвращает первый элемент производного вида. Доступно если он удовлетворяет forward_range.
(открытый член-функция std::ranges::view_interface<D>)
back
(C++20)
возвращает последний элемент производного вида. Доступно если он удовлетворяет bidirectional_range и common_range.
(открытый член-функция std::ranges::view_interface<D>)
operator[]
(C++20)
возвращает n-ый элемент производного вида. Доступно если он удовлетворяет random_access_range.
(открытый член-функция std::ranges::view_interface<D>)

Руководства по выводу типов

Вложенные классы

iterator
(C++23)
тип итератора
(только для демонстрации*)

Примечания

Макрокоманды проверки наличия функций Значение Стандарт Функция
__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:2023):
    • 26.7.31 Cartesian product view [range.stride]

См. также

ranges::zip_viewviews::zip
(C++23)
a view состоящая из кортежей ссылок на соответствующие элементы адаптированных видов
(шаблон класса) (объект точечной настройки)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/cartesian_product_view

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API