std::ranges:: views:: concat, std::ranges:: concat_view
|
헤더에 정의됨
<ranges>
|
||
|
template
<
ranges::
input_range
...
Views
>
requires
(
ranges::
view
<
Views
>
&&
...
)
&&
(
sizeof...
(
Views
)
>
0
)
&&
|
(1) | (C++26부터) |
|
namespace
views
{
inline
constexpr
/* unspecified */
concat
=
/* unspecified */
;
|
(2) | (C++26부터) |
|
호출 시그니처
|
||
|
template
<
ranges::
viewable_range
...
Rs
>
requires
/* 아래 참조 */
|
(C++26부터) | |
|
헬퍼 타입 별칭
|
||
|
template
<
class
...
Rs
>
using
/*concat-reference-t*/
=
|
(3) | ( 설명 전용* ) |
|
template
<
class
...
Rs
>
using /*concat-value-t*/ = std:: common_type_t < ranges:: range_value_t < Rs > ... > ; |
(4) | ( 설명 전용* ) |
|
template
<
class
...
Rs
>
using
/*concat-rvalue-reference-t*/
=
|
(5) | ( (설명 전용*) ) |
|
헬퍼 개념들
|
||
|
template
<
class
Ref,
class
RRef,
class
It
>
concept /*concat-indirectly-readable-impl*/ = /* 설명 참조 */ ; |
(6) | ( 설명 전용* ) |
|
template
<
class
...
Rs
>
concept /*concatable*/ = /* 설명 참조 */ ; |
(7) | ( 설명 전용* ) |
concat_view
는 임의의 수의 범위를 인수 목록으로 받아들이고, 첫 번째 범위의 첫 번째 요소에서 시작하여 마지막 범위의 마지막 요소에서 끝나며, 모든 범위 요소들이 인수로 주어진 순서대로 각각 사이에 순차적으로 배치된 뷰를 제공하는
view
팩토리를 나타냅니다. 이는 효과적으로 인수 범위들을 연결하거나 연쇄적으로 결합합니다.
views::concat
는 사용자 정의 지점 객체입니다.
서브표현식 패킷 exprs 이 주어지면, 표현식 views :: concat ( exprs... ) 은 다음에 표현식 동등 합니다:
-
views::
all
(
exprs...
)
- 단일 요소로 구성된 패킷
exprs
의 타입이
input_range를 모델링하는 경우, - concat_view ( exprs... ) - 그 외의 경우.
iter_move
를 사용자 정의하는 경우도 올바르게 지원하는 rvalue 참조.
template< class... Rs > concept /*concat-indirectly-readable*/ = // 설명용 std::common_reference_with</*concat-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...>&> && std::common_reference_with</*concat-reference-t*/<Rs...>&&, /*concat-rvalue-reference-t*/<Rs...>&&> && std::common_reference_with</*concat-rvalue-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...> const&> && (/*concat-indirectly-readable-impl*/</*concat-reference-t*/<Rs...>, /*concat-rvalue-reference-t*/<Rs...>, ranges::iterator_t<Rs>> && ...);
template< class Ref, class RRef, class It > concept /*concat-indirectly-readable-impl*/ = // exposition only requires(const It it) { { *it } -> std::convertible_to<Ref>; { ranges::iter_move(it)} -> std::convertible_to<RRef>; };
template< class... Rs > concept /*concatable*/ = requires { // exposition only typename /*concat-reference-t*/<Rs...>; typename /*concat-value-t*/<Rs...>; typename /*concat-rvalue-reference-t*/<Rs...>; } && /*concat-indirectly-readable*/<Rs...>;
concat_view
는 항상
input_range
를 모델링하며, 각각 적응된
view
타입이 해당 개념을 모델링하는 경우
forward_range
,
bidirectional_range
,
random_access_range
, 또는
sized_range
를 모델링합니다.
concat_view
는 마지막 기반 범위가
common_range
를 모델링할 경우
common_range
가 될 수 있습니다.
목차 |
커스터마이제이션 포인트 객체
views::concat
이름은
커스터마이제이션 포인트 객체
를 나타내며, 이는
함수 객체
의 상수
리터럴
semiregular
클래스 타입입니다. 자세한 내용은
CustomizationPointObject
를 참조하십시오.
데이터 멤버
| 멤버 | 설명 |
std::
tuple
<
Views...
>
views_
|
모든 적응된 뷰 객체들
( 설명 전용 멤버 객체* ) |
멤버 함수
concat_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 멤버 함수)
|
|
추론 가이드
중첩 클래스
| 클래스 이름 | 정의 |
|
반복자 타입
( 설명 전용 멤버 클래스 템플릿* ) |
헬퍼 템플릿
concat_view
에 대한
ranges::
enable_borrowed_range
특수화는 존재하지 않습니다. 이는 반복자 구현이 항상 모든 기반 범위의 모든 반복자와 센티널의 복사본을 포함해야 하기 때문입니다.
참고 사항
인수가 없는
views
::
concat
(
)
는 요소 타입
T
를 결정할 합리적인 방법이 없기 때문에 형식 오류입니다. 단일 인수
views
::
concat
(
r
)
는
views::
all
(
r
)
와 동등한 표현식입니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_ranges_concat
|
202403L
|
(C++26) |
std::ranges::concat_view
|
예제
예비 버전은 Compiler Explorer 에서 확인할 수 있습니다.
#include <cassert> #include <list> #include <print> #include <ranges> #include <vector> int main() { std::vector<int> v0{1, 2, 3}, v1{4, 5}; int a[]{6, 7}; int i{8}; auto ie{std::views::single(i)}; auto con = std::views::concat(v0, v1, a, ie); assert(con.size() == v0.size() + v1.size() + std::size(a) + ie.size()); std::println("con.size(): {}", con.size()); std::println("con: {}", con); con[6] = 42; // con is random_access_range, operator[] returns a reference assert(a[1] == 42); // a[1] was modified via con[6] std::println("con: {}", con); std::list<int> l{7, 8}; // list is bidirectional range auto cat = std::views::concat(v0, l); std::println("cat: {}", cat); // cat[0] = 13; // compile-time error: cat is bidirectional => no operator[] }
출력:
con.size(): 8 con: [1, 2, 3, 4, 5, 6, 7, 8] con: [1, 2, 3, 4, 5, 6, 42, 8] cat: [1, 2, 3, 7, 8]
참조문헌
- C++26 표준 (ISO/IEC 14882:2026):
-
- 26.7.18 Concat view [range.concat]
참고 항목
|
(C++20)
|
view
의 범위들을 평탄화하여 얻은 시퀀스로 구성된
view
(클래스 템플릿) (범위 어댑터 객체) |
범위들의
view
를 평탄화하여 얻은 시퀀스로 구성된
view
, 요소들 사이에 구분자가 있음
(클래스 템플릿) (범위 어댑터 객체) |
|
|
(C++23)
|
적응된
view
들의 해당 요소들에 대한 참조들의 튜플로 구성된
view
(클래스 템플릿) (커스터마이제이션 포인트 객체) |
적응된
view
들의 n-항 데카르트 곱으로 계산된 결과들의 튜플로 구성된
view
(클래스 템플릿) (커스터마이제이션 포인트 객체) |