Namespaces
Variants

std::ranges:: views:: concat, std::ranges:: concat_view

From cppreference.net
Ranges library
Range adaptors
헤더에 정의됨 <ranges>
template < ranges:: input_range ... Views >

requires ( ranges:: view < Views > && ... ) && ( sizeof... ( Views ) > 0 ) &&
/*concatable*/ < Views... >
class concat_view

: public ranges:: view_interface < concat_view < Views... >>
(1) (C++26부터)
namespace views {

inline constexpr /* unspecified */ concat = /* unspecified */ ;

}
(2) (C++26부터)
호출 시그니처
template < ranges:: viewable_range ... Rs >

requires /* 아래 참조 */

constexpr ranges:: view auto concat ( Rs && ... rs ) ;
(C++26부터)
헬퍼 타입 별칭
template < class ... Rs >

using /*concat-reference-t*/ =

ranges:: common_reference_t < ranges:: range_reference_t < Rs > ... > ;
(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*/ =

ranges:: common_reference_t < ranges:: range_rvalue_reference_t < Rs > ... > ;
(5) ( (설명 전용*) )
헬퍼 개념들
template < class Ref, class RRef, class It >
concept /*concat-indirectly-readable-impl*/ = /* 설명 참조 */ ;
(6) ( 설명 전용* )
template < class ... Rs >
concept /*concatable*/ = /* 설명 참조 */ ;
(7) ( 설명 전용* )

concat_view 는 임의의 수의 범위를 인수 목록으로 받아들이고, 첫 번째 범위의 첫 번째 요소에서 시작하여 마지막 범위의 마지막 요소에서 끝나며, 모든 범위 요소들이 인수로 주어진 순서대로 각각 사이에 순차적으로 배치된 뷰를 제공하는 view 팩토리를 나타냅니다. 이는 효과적으로 인수 범위들을 연결하거나 연쇄적으로 결합합니다.

1) 템플릿 매개변수가 비어 있지 않은 팩이며, 각각 최소한 view s 를 모델링하고 input_range 이며 concatable (7) 인 클래스 템플릿.
2) views::concat 는 사용자 정의 지점 객체입니다.

서브표현식 패킷 exprs 이 주어지면, 표현식 views :: concat ( exprs... ) 은 다음에 표현식 동등 합니다:

  • views:: all ( exprs... ) - 단일 요소로 구성된 패킷 exprs 의 타입이 input_range 를 모델링하는 경우,
  • concat_view ( exprs... ) - 그 외의 경우.
3) 참조 타입을 나타냅니다. 각 기반 범위의 ranges:: range_reference_t ranges:: common_reference_t 로 변환 가능하도록 보장하기 위해 추가 제약 조건이 필요합니다.
4) 기본 범위들이 프록시 반복자를 가질 경우를 지원하기 위해 iterator ::value_type 에 추가적으로 기본 범위들의 value_type 을 준수하는 것.
5) 기본 반복자가 iter_move 를 사용자 정의하는 경우도 올바르게 지원하는 rvalue 참조.
6) iterator 에 대해 indirectly-readable 개념을 정의하여 concat_view input_range 를 모델링할 수 있도록 합니다.
다음에 해당함:
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>> && ...);
설명 전용 개념 /*concat-indirectly-readable-impl*/ 은 다음과 같다
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>;
    };
7) 서로 다른 두 개 이상의 범위(range)들이 범위를 모델링하는 시퀀스로 적응될 수 있는지 여부를 결정합니다. 다음 코드와 동등합니다:
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]

참고 항목

view 의 범위들을 평탄화하여 얻은 시퀀스로 구성된 view
(클래스 템플릿) (범위 어댑터 객체)
범위들의 view 를 평탄화하여 얻은 시퀀스로 구성된 view , 요소들 사이에 구분자가 있음
(클래스 템플릿) (범위 어댑터 객체)
적응된 view 들의 해당 요소들에 대한 참조들의 튜플로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
적응된 view 들의 n-항 데카르트 곱으로 계산된 결과들의 튜플로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)