Namespaces
Variants

std::ranges:: views:: split, std::ranges:: split_view

From cppreference.net
Ranges library
Range adaptors
헤더에 정의됨 <ranges>
template < ranges:: forward_range V, ranges:: forward_range Pattern >

requires ranges:: view < V > &&
ranges:: view < Pattern > &&
std:: indirectly_comparable < ranges:: iterator_t < V > ,
ranges:: iterator_t < Pattern > ,
ranges:: equal_to >
class split_view

: public ranges:: view_interface < split_view < V, Pattern >>
(1) (C++20 이후)
namespace views {

inline constexpr /* 지정되지 않음 */ split = /* 지정되지 않음 */ ;

}
(2) (C++20 이후)
호출 시그니처
template < ranges:: viewable_range R, class Pattern >

requires /* 아래 참조 */

constexpr ranges:: view auto split ( R && r, Pattern && pattern ) ;
(C++20 이후)
template < class Pattern >
constexpr /* 범위 어댑터 클로저 */ split ( Pattern && pattern ) ;
(C++20 이후)
1) split_view view 와 구분자를 취하고, 해당 view 를 구분자 기준으로 부분 범위(subranges)로 분할합니다.
2) RangeAdaptorObject . 표현식 views :: split ( e, p ) 표현식 동등 합니다 split_view ( e, p ) 에 대해, 적절한 부분표현식 e p 가 주어질 때.

split_view 는 기본 forward_range common_range 개념을 각각 모델링할 때 해당 개념들을 모델링합니다.

내부 범위( ranges:: range_reference_t < split_view > )는 ranges:: subrange < ranges:: iterator_t < V >> 로서, common_range 을 모델링하며, ranges:: iterator_t < V > std:: sized_sentinel_for < ranges:: iterator_t < V >> 를 모델링할 때 sized_range 를 모델링합니다. 또한 V 가 해당 개념들을 모델링할 때 contiguous_range , random_access_range , bidirectional_range , 그리고 forward_range 을 모델링합니다.

lazy_split_view 와 달리, split_view 는 부분 범위의 연속성을 유지하므로 문자열 분할에 적합합니다.

목차

데이터 멤버

멤버 설명
V base_ (private) 기반(적응된) view
( 설명 전용 멤버 객체* )
Pattern pattern_ (private) 기반 view 를 분할하는 데 구분자로 사용되는 패턴 객체
( 설명 전용 멤버 객체* )
non-propagating-cache < ranges:: subrange
< ranges:: iterator_t < V >>>
cached_begin_ (private)
첫 번째 begin() 호출 결과를 캐시하는 객체
( 설명 전용 멤버 객체* )

멤버 함수

split_view 를 생성합니다
(public member function)
기본(적응된) 뷰의 복사본을 반환합니다
(public member function)
시작 부분에 대한 반복자를 반환합니다
(public member function)
끝 부분에 대한 반복자나 센티널을 반환합니다
(public member function)
패턴의 다음 발생을 검색합니다
( exposition-only member function* )
std::ranges::view_interface 로부터 상속됨
파생된 뷰가 비어 있는지 여부를 반환합니다 ( sized_range 또는 forward_range 를 만족하는 경우에만 제공됨)
( std::ranges::view_interface<D> 의 public member function)
(C++23)
범위의 시작 부분에 대한 상수 반복자를 반환합니다
( std::ranges::view_interface<D> 의 public member function)
(C++23)
범위의 상수 반복자에 대한 센티널을 반환합니다
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰가 비어 있지 않은지 여부를 반환합니다 ( ranges::empty 가 적용 가능한 경우에만 제공됨)
( std::ranges::view_interface<D> 의 public member function)
파생된 뷰의 첫 번째 요소를 반환합니다 ( forward_range 를 만족하는 경우에만 제공됨)
( std::ranges::view_interface<D> 의 public member function)

중첩 클래스

반복자 타입
( 설명 전용 멤버 클래스* )
센티넬 타입
( 설명 전용 멤버 클래스* )

추론 가이드

참고 사항

P2210R2 이전에는, split_view 지연(lazy) 방식의 분할 메커니즘을 사용했기 때문에, 기본 뷰의 양방향, 임의 접근, 또는 연속 속성을 유지할 수 없었으며, 내부 범위의 반복자 타입을 기본 뷰의 반복자 타입과 동일하게 만들 수 없었습니다. 결과적으로, P2210R2 에 의해 재설계되었으며, 지연 메커니즘은 lazy_split_view 로 이동되었습니다.

구분자 pattern 은 일반적으로 일반 문자열 리터럴이어서는 안 됩니다. 널 종결자를 구분자의 필수 부분으로 간주하기 때문입니다. 따라서 대신 std::string_view 리터럴을 사용하는 것이 바람직합니다.

예제

#include <iomanip>
#include <iostream>
#include <ranges>
#include <string_view>
int main()
{
    using std::operator""sv;
    constexpr auto words{"Hello^_^C++^_^20^_^!"sv};
    constexpr auto delim{"^_^"sv};
    for (const auto word : std::views::split(words, delim))
        // string_view의 C++23 범위 생성자 사용:
        std::cout << std::quoted(std::string_view(word)) << ' ';
    std::cout << '\n';
}

출력:

"Hello" "C++" "20" "!"

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
P2210R2 C++20 기존 split_view 는 사용하기 너무 지연(lazy)되어 있었음 재설계됨

참고 항목

다른 view 를 구분자로 분할하여 얻은 하위 범위들에 대한 view
(클래스 템플릿) (범위 어댑터 객체)
range s view 를 평탄화하여 얻은 시퀀스로 구성된 view
(클래스 템플릿) (범위 어댑터 객체)