Namespaces
Variants

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

cppreference.net에서 가져옴
 
 
범위 라이브러리
범위 어댑터
 
 
헤더 <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 /* unspecified */ split = /* unspecified */;
}
(2) (C++20부터)
호출 시그니처
template< ranges::viewable_range R, class Pattern >
    requires /* see below */
constexpr ranges::view auto split( R&& r, Pattern&& pattern );
(C++20부터)
template< class Pattern >
constexpr /* range adaptor closure */ split( Pattern&& pattern );
(C++20부터)
1) split_view view와 구분자를 받아서, 구분자를 기준으로 view를 하위 범위로 분할합니다.
2) RangeAdaptorObject. 표현식 views::split(e, p)은 표현식-동등하여 split_view(e, p)와 동일합니다. 여기서 e와 p는 적절한 하위 표현식입니다.

split_view는 기본 forward_range 개념을 모델링하고, 기본 view가 해당 개념을 모델링할 때 common_range V를 모델링합니다.

내부 범위 (ranges::range_reference_t<split_view>)는 ranges::subrange<ranges::iterator_t<V>>이며, common_range를 모델링하고, 가 를 모델링할 때 ranges::iterator_t<V>sized_rangestd::sized_sentinel_for<ranges::iterator_t<V>>를 모델링하며, 가 해당 개념을 모델링할 때 contiguous_range, random_access_range, bidirectional_range, forward_rangeV를 모델링합니다.

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* )
ranges::view_interface
empty파생된 뷰가 비어있는지 여부를 반환하며, 이는 해당 뷰가 sized_range 또는
forward_rangestd::ranges::view_interface<D>를 만족할 때만 제공됩니다.
의 공개 멤버 함수)
cbegin
(C++23)std::ranges::view_interface<D>범위의 시작을 가리키는 상수 반복자를 반환합니다.
의 공개 멤버 함수)
cend
(C++23)std::ranges::view_interface<D>범위의 상수 반복자에 대한 센티널을 반환합니다.
의 공개 멤버 함수)operator bool파생된 뷰가 비어있지 않은지 여부를 반환하며, 이는
ranges::emptystd::ranges::view_interface<D>가 적용 가능할 때만 제공됩니다.
의 공개 멤버 함수)front
파생된 뷰의 첫 번째 요소를 반환하며, 이는 해당 뷰가 std::ranges::view_interface<D>forward_range
를 만족할 때 제공됩니다.

중첩 클래스

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

추론 가이드

참고 사항

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
(클래스 템플릿) (범위 어댑터 객체)