Namespaces
Variants

std::ranges:: views:: cartesian_product, std::ranges:: cartesian_product_view

From cppreference.net
Ranges library
Range adaptors
cartesian_product_view views::cartesian_product
(C++23) (C++23)

헤더에 정의됨 <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 /* 아래 참조 */

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) ( exposition only* )
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) ( exposition only* )
1) cartesian_product_view n 개의 view s 를 취하는 범위 어댑터입니다(여기서 n > 0 ). 이는 제공된 범위들의 n항 데카르트 곱 으로 계산된 튜플들의 view 를 생성합니다. 생성된 view의 크기는 제공된 범위들의 크기의 곱이며, 각 요소는 크기 n 의 (참조) 튜플입니다.
2) views::cartesian_product 는 커스터마이제이션 포인트 객체입니다.
3) cartesian_product 가 랜덤 액세스 범위인지 판단합니다 (참고: random_access_range ).
4) cartesian_product 가 공통 범위(common range)인지 판단합니다 (참고: common_range ).
5) cartesian_product 가 양방향 범위인지 판단합니다 (참고: bidirectional_range ).
6) cartesian_product 이 헬퍼 컨셉 /*cartesian-product-is-common*/ 을 만족하는지 판단합니다 (참조: common_range ).
7) cartesian_product 가 크기 지정 범위(sized range)인지 판단합니다(참고: sized_range ).
8) cartesian_product 가 크기가 지정된 센티널을 사용하는지 결정합니다.
9) 생성된 view 의 끝을 반환합니다. cartesian_product 가 헬퍼 개념 /*cartesian-product-common-arg*/ 을 만족하는 경우에만 오버로드 해결에 참여합니다.

cartesian_product_view 에 전달되는 첫 번째 range 는 특별하게 취급됩니다. 이는 단 한 번만 전달되기 때문입니다. 결과적으로, 이에 대해 여러 제약 조건이 완화됩니다:

목차

커스터마이제이션 포인트 객체

views::cartesian_product 라는 이름은 커스터마이제이션 포인트 객체 를 나타내며, 이는 함수 객체 의 리터럴 리터럴 semiregular 클래스 타입의 상수입니다. 자세한 내용은 CustomizationPointObject 를 참조하십시오.

데이터 멤버

멤버 정의
std:: tuple < First, Vs... > base_ (private) 모든 적응된 view 객체를 보유하는 객체.
( 설명 전용 멤버 객체* )

멤버 함수

cartesian_product_view 를 생성합니다
(public 멤버 함수)
시작 부분을 가리키는 반복자를 반환합니다
(public 멤버 함수)
끝 부분을 가리키는 반복자나 센티널을 반환합니다
(public 멤버 함수)
요소의 개수를 반환합니다. 기본(적응된) 범위가 sized_range 를 만족할 때만 제공됩니다
(public 멤버 함수)
std::ranges::view_interface 로부터 상속됨
파생된 뷰가 비어 있는지 여부를 반환합니다. sized_range forward_range 를 만족할 때만 제공됩니다
( std::ranges::view_interface<D> 의 public 멤버 함수)
(C++23)
범위의 시작을 가리키는 상수 반복자를 반환합니다
( std::ranges::view_interface<D> 의 public 멤버 함수)
(C++23)
범위의 상수 반복자에 대한 센티널을 반환합니다
( std::ranges::view_interface<D> 의 public 멤버 함수)
파생된 뷰가 비어 있지 않은지 여부를 반환합니다. ranges::empty 가 적용 가능할 때만 제공됩니다
( std::ranges::view_interface<D> 의 public 멤버 함수)
파생된 뷰의 첫 번째 요소를 반환합니다. forward_range 를 만족할 때 제공됩니다
( std::ranges::view_interface<D> 의 public 멤버 함수)
파생된 뷰의 마지막 요소를 반환합니다. bidirectional_range common_range 를 만족할 때만 제공됩니다
( std::ranges::view_interface<D> 의 public 멤버 함수)
파생된 뷰의 n 번째 요소를 반환합니다. random_access_range 를 만족할 때만 제공됩니다
( std::ranges::view_interface<D> 의 public 멤버 함수)

추론 가이드

중첩 클래스

반복자 타입
( 설명 전용 멤버 클래스 템플릿* )

참고 사항

기능 테스트 매크로 표준 기능
__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 Cartesian product view [range.stride]

참고 항목

적응된 뷰들의 상응하는 요소들에 대한 참조의 튜플로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)