Namespaces
Variants

std::ranges:: views:: filter, std::ranges:: filter_view

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

std:: indirect_unary_predicate < ranges:: iterator_t < V >> Pred >
requires ranges:: view < V > && std:: is_object_v < Pred >
class filter_view

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

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

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

requires /* 아래 참조 */

constexpr ranges:: view auto filter ( R && r, Pred && pred ) ;
(C++20 이후)
template < class Pred >
constexpr /* 범위 어댑터 클로저 */ filter ( Pred && pred ) ;
(C++20 이후)
1) 기본 시퀀스의 요소 중 조건자를 만족하는 요소들만을 나타내는 view 범위 어댑터.
2) RangeAdaptorObject . 표현식 views :: filter ( e, p ) 표현식 동등 합니다 filter_view ( e, p ) 에 대해, 적절한 부분표현식 e p 가 주어질 때.

filter_view 는 기본 bidirectional_range , forward_range , input_range , 그리고 common_range 개념들을 각각 모델링하는 경우, 해당 개념들을 모델링합니다.

목차

데이터 멤버

멤버 설명
V base_ 기반 뷰
( 설명 전용 멤버 객체* )
copyable-box <Pred> (until C++23) movable-box <Pred> (since C++23) pred_ base_ 의 요소를 필터링하는 데 사용되는 조건자를 감싼 객체
( 설명 전용 멤버 객체* )
non-propagating-cache < ranges:: iterator_t < V >> begin_
( V forward_range 를 만족할 때만 존재)
base_ 에서 pred_ 를 만족하는 첫 번째 요소에 대한 반복자를 캐싱하는 객체
( 설명 전용 멤버 객체* )

멤버 함수

filter_view 를 생성합니다
(public member function)
기본 뷰 V 를 반환합니다
(public member function)
filter_view 내부에 저장된 predicate에 대한 참조를 반환합니다
(public member function)
filter_view 의 시작 반복자를 반환합니다
(public member function)
filter_view 의 sentinel을 반환합니다
(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)
범위의 상수 반복자에 대한 sentinel을 반환합니다
( 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)
파생 뷰의 마지막 요소를 반환합니다 ( bidirectional_range common_range 를 만족할 때만 제공됨)
( std::ranges::view_interface<D> 의 public member function)

std::ranges::filter_view:: filter_view

filter_view ( ) requires std:: default_initializable < V > &&
std:: default_initializable < Pred > = default ;
(1) (since C++20)
constexpr explicit filter_view ( V base, Pred pred ) ;
(2) (since C++20)
1) 기본 멤버 초기화자( = V ( ) )를 통해 base_ 를 값 초기화하고 pred_ 를 기본 초기화합니다(포함된 Pred 를 값 초기화함).
2) base_ std :: move ( base ) 로 초기화하고 pred_ std :: move ( pred ) 로 초기화합니다.

매개변수

base - 필터링할 범위
pred - 요소를 필터링할 predicate

std::ranges::filter_view:: base

constexpr V base ( ) const & requires std:: copy_constructible < V > ;
(1) (C++20 이후)
constexpr V base ( ) && ;
(2) (C++20 이후)
1) 다음 코드와 동등함: return base_ ; .
2) 다음 코드와 동등함: return std :: move ( base_ ) ; .

std::ranges::filter_view:: pred

constexpr const Pred & pred ( ) const ;
(C++20 이후)

포함된 Pred 객체에 대한 참조를 반환합니다. pred_ 가 값을 포함하지 않는 경우의 동작은 정의되지 않습니다.

std::ranges::filter_view:: begin

constexpr /*iterator*/ begin ( ) ;
( 설명 전용* )

range 개념에서 요구하는 분할 상환 상수 시간 복잡도를 제공하기 위해, 이 함수는 결과를 filter_view 객체 내에 캐시하여 이후 호출에서 사용합니다. 다음 코드와 동일합니다:

if constexpr (!ranges::forward_range<V>)
    return /*iterator*/{*this, ranges::find_if(base_, std::ref(*pred_))};
else
{
    if (!begin_.has_value())
        begin_ = ranges::find_if(base_, std::ref(*pred_)); // caching
    return /*iterator*/{*this, begin_.value())};
}

pred_ 가 값을 포함하지 않는 경우의 동작은 정의되지 않습니다.

std::ranges::filter_view:: end

constexpr auto end ( ) ;
(C++20부터)

끝을 가리키는 반복자를 반환합니다. 다음 코드와 동일합니다:

if constexpr (ranges::common_range<V>)
    return /*iterator*/{*this, ranges::end(base_)};
else
    return /*sentinel*/{*this};

추론 가이드

template < class R, class Pred >
filter_view ( R && , Pred ) - > filter_view < views:: all_t < R > , Pred > ;
(C++20 이후)

중첩 클래스

filter_view 의 반복자 타입
( 설명 전용 멤버 클래스* )
기본 뷰가 common_range 가 아닐 때의 filter_view 센티넬 타입
( 설명 전용 멤버 클래스* )

예제

#include <iostream>
#include <ranges>
int main()
{
    auto even = [](int i) { return 0 == i % 2; };
    auto square = [](int i) { return i * i; };
    for (int i : std::views::iota(0, 6)
               | std::views::filter(even)
               | std::views::transform(square))
        std::cout << i << ' ';
    std::cout << '\n';
}

출력:

0 4 16

결함 보고서

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

DR 적용 대상 게시된 동작 수정된 동작
LWG 3714
( P2711R1 )
C++20 다중 매개변수 생성자가 explicit이 아니었음 explicit으로 변경됨
P2325R3 C++20 Pred default_initializable 가 아닌 경우, 기본 생성자가
Pred 를 포함하지 않는 filter_view 를 생성함
filter_view 또한
default_initializable 가 아님

참고 항목

다른 view 의 초기 요소들로 구성된 view 로, 술어(predicate)가 false 를 반환하는 첫 번째 요소까지 포함
(클래스 템플릿) (범위 어댑터 객체)