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) | ( exposition only* ) |
|
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
>
concept
/*cartesian-is-sized-sentinel*/
=
|
(8) | ( 설명 전용* ) |
|
헬퍼 함수 템플릿
|
||
|
template
<
/*cartesian-product-common-arg*/
R
>
constexpr
auto
/*cartesian-common-arg-end*/
(
R
&
r
)
|
(9) | ( exposition only* ) |
cartesian_product_view
는
n
개의
view
s
를 취하는 범위 어댑터입니다(여기서
n > 0
). 이는 제공된 범위들의
n항 데카르트 곱
으로 계산된 튜플들의
view
를 생성합니다. 생성된 view의 크기는 제공된 범위들의 크기의 곱이며, 각 요소는 크기
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
가 크기가 지정된 센티널을 사용하는지 결정합니다.
view
의 끝을 반환합니다.
cartesian_product
가 헬퍼 개념
/*cartesian-product-common-arg*/
을 만족하는 경우에만 오버로드 해결에 참여합니다.
cartesian_product_view
에 전달되는 첫 번째
range
는 특별하게 취급됩니다. 이는 단 한 번만 전달되기 때문입니다. 결과적으로, 이에 대해 여러 제약 조건이 완화됩니다:
-
First는forward_range가 아닌input_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_
(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]
참고 항목
|
(C++23)
|
적응된 뷰들의 상응하는 요소들에 대한 참조의 튜플로 구성된
view
(클래스 템플릿) (커스터마이제이션 포인트 객체) |