std::ranges::views::lazy_split, std::ranges::lazy_split_view
cppreference.net에서 가져옴
| 헤더 <ranges>
|
||
template< ranges::input_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> &&
(ranges::forward_range<V> || /*tiny-range*/<Pattern>)
class lazy_split_view
: public ranges::view_interface<lazy_split_view<V, Pattern>>
|
에 정의됨 | (C++20부터) |
namespace views {
inline constexpr /* unspecified */ lazy_split = /* unspecified */;
}
|
(2) | (C++20부터) |
| 호출 시그니처 |
||
template< ranges::viewable_range R, class Pattern >
requires /* see below */
constexpr ranges::view auto lazy_split( R&& r, Pattern&& pattern );
|
(C++20부터) | |
template< class Pattern >
constexpr /* range adaptor closure */ lazy_split( Pattern&& pattern );
|
(C++20부터) | |
| 헬퍼 개념 |
||
template< class R >
concept /*tiny-range*/ =
ranges::sized_range<R> &&
requires { /* is-statically-constexpr-sized */<R>; } &&
(std::remove_reference_t<R>::size() <= 1);
|
(3) | (설명 전용*) |
1)
lazy_split_view view와 구분자를 받아서, 구분자를 기준으로 view를 부분 범위로 분할합니다.
두 가지 주요 시나리오가 지원됩니다:
- 뷰가 input_range이고, 구분자가 단일 요소(
single_view에 래핑됨)인 경우. - 뷰가 forward_range이고, 구분자가 요소들의 view인 경우.
2) RangeAdaptorObject입니다. 표현식
views::lazy_split(e, f)은 expression-equivalent하여 lazy_split_view(e, f)입니다.3) 설명 전용 개념
/*tiny-range*/<Pattern>은 Pattern이 sized_range를 만족하고, Pattern::size()이 상수 표현식이며 템플릿 비타입 인자로 적합하고, Pattern::size()의 값이 1보다 작거나 같은 경우에 충족됩니다. 특히, empty_view와 single_view는 이 개념을 만족합니다.lazy_split_view 기본 view가 각 개념을 모델링할 때, 개념 forward_range와 input_range V를 모델링하고, 이 forward_rangeV와 common_range를 모두 모델링할 때 common_range를 모델링합니다.
내부 범위(ranges::range_reference_t<lazy_split_view>)는 기본 view가 각 개념을 모델링할 때, 개념 forward_range와 input_range V를 모델링합니다. 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) |
|
ranges::view_interface | |
| 파생된 뷰가 비어 있는지를 반환하며, 이는 뷰가 sized_range 또는 forward_range 를 만족할 때만 제공됩니다. std::ranges::view_interface<D>의 공개 멤버 함수)
| |
(C++23) |
범위의 시작을 가리키는 상수 반복자를 반환합니다. 의 공개 멤버 함수) std::ranges::view_interface<D>cend
|
범위의 상수 반복자에 대한 센티널을 반환합니다. |
의 공개 멤버 함수) operator bool std::ranges::view_interface<D>파생된 뷰가 비어 있지 않은지를 반환하며, 이는
|
| 을 적용할 수 있는 경우에만 제공됩니다.의 공개 멤버 함수)ranges::empty 는 해당 뷰에 적용 가능합니다. std::ranges::view_interface<D>의 공개 멤버 함수)
| |
| 파생된 뷰의 첫 번째 요소를 반환하며, 이는 뷰가 forward_range 를 만족할 때 제공됩니다. std::ranges::view_interface<D>의 공개 멤버 함수)
| |
중첩 클래스
|
반복자 타입
( 설명 전용 멤버 클래스 템플릿* ) |
|
|
내부 범위의 반복자 타입
( 설명 전용 멤버 클래스 템플릿* ) |
추론 가이드
참고 사항
이름
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
(클래스 템플릿) (범위 어댑터 객체) |