std::ranges:: views:: filter, std::ranges:: filter_view
|
헤더 파일에 정의됨
<ranges>
|
||
|
template
<
ranges::
input_range
V,
std::
indirect_unary_predicate
<
ranges::
iterator_t
<
V
>>
Pred
>
|
(1) | (C++20 이후) |
|
namespace
views
{
inline
constexpr
/* 지정되지 않음 */
filter
=
/* 지정되지 않음 */
;
|
(2) | (C++20 이후) |
|
호출 시그니처
|
||
|
template
<
ranges::
viewable_range
R,
class
Pred
>
requires
/* 아래 참조 */
|
(C++20 이후) | |
|
template
<
class
Pred
>
constexpr /* 범위 어댑터 클로저 */ filter ( Pred && pred ) ; |
(C++20 이후) | |
view
범위 어댑터.
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) |
base_
를 값 초기화하고
pred_
를 기본 초기화합니다(포함된
Pred
를 값 초기화함).
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 이후) |
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
를 반환하는 첫 번째 요소까지 포함
(클래스 템플릿) (범위 어댑터 객체) |