std::ranges:: views:: lazy_split, std::ranges:: lazy_split_view
|
헤더 파일에 정의됨
<ranges>
|
||
|
template
<
ranges::
input_range
V,
ranges::
forward_range
Pattern
>
requires
ranges::
view
<
V
>
&&
|
(1) | (C++20 이후) |
|
namespace
views
{
inline
constexpr
/* 지정되지 않음 */
lazy_split
=
/* 지정되지 않음 */
;
|
(2) | (C++20 이후) |
|
호출 시그니처
|
||
|
template
<
ranges::
viewable_range
R,
class
Pattern
>
requires
/* 아래 참조 */
|
(C++20 이후) | |
|
template
<
class
Pattern
>
constexpr /* 범위 어댑터 클로저 */ lazy_split ( Pattern && pattern ) ; |
(C++20 이후) | |
|
헬퍼 개념
|
||
|
template
<
class
R
>
concept
/*tiny-range*/
=
|
(3) | ( (설명 전용*) ) |
lazy_split_view
는
view
와 구분자를 취하며,
view
를 구분자 기준으로 부분 범위(subranges)로 분할합니다.
두 가지 주요 시나리오가 지원됩니다:
-
뷰가
input_range이고, 구분자가 단일 요소인 경우(single_view로 래핑됨). -
뷰가
forward_range이고, 구분자가 요소들의view인 경우.
Pattern
이
sized_range
를 만족하고,
Pattern
::
size
(
)
가 상수 표현식이며 템플릿 상수 인자로 적합하고,
Pattern
::
size
(
)
의 값이
1
보다 작거나 같아야 합니다. 특히,
empty_view
와
single_view
는 이 개념을 만족합니다.
lazy_split_view
는 기본
forward_range
와
input_range
개념을 각각 모델링하는 경우 해당 개념들을 모델링하며,
V
가
forward_range
와
common_range
를 모두 모델링할 때
common_range
를 모델링합니다.
내부 범위(
ranges::
range_reference_t
<
lazy_split_view
>
)는 기본
view
V
가 해당 개념들을 만족할 때
forward_range
와
input_range
개념을 모델링합니다.
common_range
는 모델링하지 않으며,
bidirectional_range
이상을 기대하는 알고리즘과 함께 사용할 수 없습니다.
split_view
와 달리,
lazy_split_view
는 부분 범위의 연속성을 유지하지 않습니다.
목차 |
데이터 멤버
| 멤버 | 설명 |
V
base_
(private)
|
기반이 되는
view
( 설명 전용 멤버 객체* ) |
Pattern
pattern_
(private)
|
기반
view
를 분할하는 데 구분자로 사용되는 패턴
( 설명 전용 멤버 객체* ) |
non-propagating-cache
<
ranges::
iterator_t
<
V
>>
current_
(private)
(
V
가
forward_range
를 만족하지 않는 경우에만 존재)
|
begin()
호출 결과를 캐싱하는 객체
( 설명 전용 멤버 객체* ) |
멤버 함수
lazy_split_view
를 생성합니다
(public member function) |
|
|
기반(적응된) 뷰의 복사본을 반환합니다
(public member function) |
|
|
시작 부분을 가리키는 반복자를 반환합니다
(public member function) |
|
|
끝 부분을 가리키는 반복자나 센티널을 반환합니다
(public 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)
|
|
중첩 클래스
|
반복자 타입
( 설명 전용 멤버 클래스 템플릿* ) |
|
|
내부 범위의 반복자 타입
( 설명 전용 멤버 클래스 템플릿* ) |
추론 가이드
참고 사항
이름
lazy_split_view
는 C++20 이후 결함 보고서
P2210R2
에 의해 도입되었습니다. 이는 변경 전 기존
split_view
와 동일한 지연(lazy) 메커니즘을 가지고 있습니다.
예제
#include <algorithm> #include <iostream> #include <ranges> #include <string_view> auto print = [](auto const& view) { // `view`는 std::views::lazy_split_view::__outer_iterator::value_type 타입입니다 for (std::cout << "{ "; const auto element : view) std::cout << element << ' '; std::cout << "} "; }; int main() { constexpr static auto source = {0, 1, 0, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9}; constexpr int delimiter{0}; constexpr std::ranges::lazy_split_view outer_view{source, delimiter}; std::cout << "splits[" << std::ranges::distance(outer_view) << "]: "; for (auto const& inner_view: outer_view) print(inner_view); constexpr std::string_view hello{"Hello C++ 20 !"}; std::cout << "\n" "substrings: "; std::ranges::for_each(hello | std::views::lazy_split(' '), print); constexpr std::string_view text{"Hello-+-C++-+-20-+-!"}; constexpr std::string_view delim{"-+-"}; std::cout << "\n" "substrings: "; std::ranges::for_each(text | std::views::lazy_split(delim), print); }
출력:
splits[5]: { } { 1 } { 2 3 } { 4 5 6 } { 7 8 9 }
substrings: { H e l l o } { C + + } { 2 0 } { ! }
substrings: { H e l l o } { C + + } { 2 0 } { ! }
결함 보고서
다음 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| P2210R2 | C++20 |
기존
split_view
는 사용하기 쉽지 않을 정도로 지연(lazy) 동작이었음
|
해당 기능을
lazy_split_view
로 이동
|
참고 항목
|
(C++20)
|
다른
view
를 구분자(delimiter)를 사용하여 분할하여 얻은 하위 범위(subranges)에 대한
view
(클래스 템플릿) (범위 어댑터 객체) |
|
(C++20)
|
range
s
의
view
를 평탄화(flattening)하여 얻은 시퀀스로 구성된
view
(클래스 템플릿) (범위 어댑터 객체) |