Namespaces
Variants

std::ranges:: lazy_split_view<V, Pattern>:: outer_iterator

From cppreference.net
Ranges library
Range adaptors
template < bool Const >
struct /*outer_iterator*/ ;
(C++20부터)
( 설명 전용* )

lazy_split_view::begin 의 반환 타입, 그리고 lazy_split_view::end 의 반환 타입(기반 뷰가 common_range 이면서 forward_range 인 경우).

만약 V 또는 Pattern 중 하나가 단순 뷰(simple view) 가 아닌 경우(예: ranges:: iterator_t < const V > 가 유효하지 않거나 ranges:: iterator_t < V > 와 다른 경우), Const 는 const 오버로드에서 반환된 반복자에 대해 true 이고, 그렇지 않은 경우 false 입니다. 만약 V 가 단순 뷰인 경우, Const V forward_range 인 경우에만 true 입니다.

목차

멤버 타입

멤버 정의
Parent maybe-const  < Const, ranges:: lazy_split_view >
( 설명 전용 멤버 타입* )
Base maybe-const  < Const, V >
( 설명 전용 멤버 타입* )
iterator_concept
iterator_category
(존재하는 경우는 Base forward_range 를 모델링할 때만)
std::input_iterator_tag
outer_iterator 의 값 타입
(공개 멤버 클래스)
difference_type ranges:: range_difference_t < Base >

데이터 멤버

멤버 설명
Parent * parent_ (private) 부모 객체에 대한 포인터 lazy_split_view
( 설명 전용 멤버 객체* )
ranges:: iterator_t < Base > current_ (private)
( V forward_range 를 모델링할 때만 존재함)
기본 view 의 반복자
( 설명 전용 멤버 객체* )
bool trailing_empty_ (private) 빈 후행 하위 범위(있는 경우)에 도달했는지 여부를 나타내는 플래그
( 설명 전용 멤버 객체* )

멤버 함수

(constructor)
반복자를 생성함
(public member function)
operator*
현재 서브레인지를 반환함
(public member function)
operator++ operator++ (int)
반복자를 전진시킴
(public member function)
cur
조건부로 current_ 에 대한 참조(존재하는 경우) 또는 * parent_ - > current_ 에 대한 참조를 반환함
( 설명 전용 멤버 함수* )

멤버 함수

std::ranges::lazy_split_view:: outer_iterator :: outer_iterator

/*outer_iterator*/ ( ) = default ;
(1) (since C++20)
constexpr explicit /*outer_iterator*/ ( Parent & parent )
requires ( ! ranges:: forward_range < Base > ) ;
(2) (since C++20)
constexpr /*outer_iterator*/ ( Parent & parent,

ranges:: iterator_t < Base > current )

requires ranges:: forward_range < Base > ;
(3) (since C++20)
constexpr /*outer_iterator*/ ( /*outer_iterator*/ < ! Const > i )

requires Const && std:: convertible_to < ranges:: iterator_t < V > ,

ranges:: iterator_t < Base >> ;
(4) (since C++20)
1) 비정적 데이터 멤버들을 기본 멤버 초기화자로 값 초기화합니다. 즉:
  • parent_ = nullptr ; ,
  • current_ = iterator_t < Base > ( ) ; ( V forward_range 를 모델링하는 경우에만 존재함),
2) parent_ std:: addressof ( parent ) 로 초기화합니다.
3) parent_ std:: addressof ( parent ) 로, current_ std :: move ( current ) 로 초기화합니다.
4) parent_ i. parent_ 로, current_ std :: move ( i. current_ ) 로, trailing_empty_ t. trailing_empty_ 로 초기화합니다.

trailing_empty_ 는 기본 멤버 초기화자에 의해 false 로 초기화됩니다.

std::ranges::lazy_split_view:: outer_iterator :: operator*

constexpr value_type operator * ( ) const ;
(C++20 이후)

value_type{*this} 를 반환하는 것과 동등합니다.

std::ranges::lazy_split_view:: outer_iterator :: operator++

constexpr /*outer_iterator*/ & operator ++ ( ) ;
(1) (C++20부터)
constexpr decltype ( auto ) operator ++ ( int ) ;
(2) (C++20부터)
1) 함수 본문은 다음과 동등함
const auto end = ranges::end(parent_->base_);
if (/*cur*/() == end)
{
    trailing_empty_ = false;
    return *this;
}
const auto [pbegin, pend] = ranges::subrange{parent_->pattern_};
if (pbegin == pend)
    ++/*cur*/();
else if constexpr (/*tiny_range*/<Pattern>)
{
    /*cur*/() = ranges::find(std::move(/*cur*/()), end, *pbegin);
    if (/*cur*/() != end)
    {
        ++/*cur*/();
        if (/*cur*/() == end)
            trailing_empty_ = true;
    }
}
else
{
    do
    {
        auto [b, p] = ranges::mismatch(/*cur*/(), end, pbegin, pend);
        if (p == pend)
        {
            /*cur*/() = b;
            if (/*cur*/() == end)
                trailing_empty_ = true;
            break; // 패턴이 일치함; 건너뜀
        }
    } while (++/*cur*/() != end);
}
return *this;
2) 다음과 동등함
if constexpr (ranges::forward_range<Base>)
{
    auto tmp = *this;
    ++*this;
    return tmp;
}
else
{
    ++*this; // 반환문 없음
}

std::ranges::lazy_split_view:: outer_iterator :: cur ()

constexpr auto & /*cur*/ ( ) noexcept ;
(1) (C++20 이후)
( 설명 전용* )
constexpr auto & /*cur*/ ( ) const noexcept ;
(2) (C++20 이후)
( 설명 전용* )

이 편의 멤버 함수는 /*outer_iterator*/ :: operator ++ ( ) , 비멤버 operator == ( const /*outer_iterator*/ & , std:: default_sentinel_t ) , 그리고 inner_iterator 의 가능한 구현의 일부 멤버 함수에서 참조됩니다.

1,2) 다음 코드와 동등합니다:
if constexpr (ranges::forward_range<V>)
    return current_;
else
    return *parent->current_;

비멤버 함수

operator==
(C++20)
기본 반복자 또는 기본 반복자와 std::default_sentinel 을 비교합니다
(함수)

operator== (std::ranges::split_view:: outer_iterator )

friend constexpr bool operator == ( const /*outer_iterator*/ & x,

const /*outer_iterator*/ & y )

requires forward_range < Base > ;
(1) (since C++20)
friend constexpr bool operator == ( const /*outer_iterator*/ & x,
std:: default_sentinel_t ) ;
(2) (since C++20)
1) 다음 코드와 동등함: return x. current_ == y. current_ and x. trailing_empty_ == y. trailing_empty_ ; .
2) 다음 코드와 동등함: return x. /*cur*/ ( ) == ranges:: end ( x. parent_ - > base_ ) and ! x. trailing_empty_ ; .

!= 연산자는 합성됨 ( operator== 로부터).

이 함수들은 일반적인 비한정 또는 한정 조회 에는 보이지 않으며, std::ranges::split_view:: outer_iterator 가 인자들의 연관 클래스일 때만 인자 종속 조회 에 의해 찾을 수 있습니다.

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 3904 C++20 trailing_empty_ 가 생성자 ( 4 )에서 초기화되지 않음 초기화됨