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
/* unspecified */
filter
=
/* unspecified */
;
|
(2) | (начиная с C++20) |
|
Сигнатура вызова
|
||
|
template
<
ranges::
viewable_range
R,
class
Pred
>
requires
/* see below */
|
(начиная с C++20) | |
|
template
<
class
Pred
>
constexpr /* range adaptor closure */ filter ( Pred && pred ) ; |
(начиная с C++20) | |
view
базовой последовательности только с элементами, удовлетворяющими предикату.
filter_view
моделирует концепции
bidirectional_range
,
forward_range
,
input_range
и
common_range
, когда базовое
view
V
моделирует соответствующие концепции.
Содержание |
Члены данных
| Член | Описание |
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
(публичная функция-член) |
|
возвращает базовое представление
V
(публичная функция-член) |
|
возвращает ссылку на предикат, хранящийся в
filter_view
(публичная функция-член) |
|
возвращает начальный итератор
filter_view
(публичная функция-член) |
|
возвращает страж
filter_view
(публичная функция-член) |
|
Унаследовано от std::ranges::view_interface |
|
возвращает, является ли производное представление пустым, предоставляется только если оно удовлетворяет
sized_range
или
forward_range
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
|
(C++23)
|
возвращает константный итератор на начало диапазона
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
(C++23)
|
возвращает страж для константного итератора диапазона
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
возвращает, является ли производное представление непустым, предоставляется только если
ranges::empty
применимо к нему
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
возвращает первый элемент в производном представлении, предоставляется если оно удовлетворяет
forward_range
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
возвращает последний элемент в производном представлении, предоставляется только если оно удовлетворяет
bidirectional_range
и
common_range
(публичная функция-член
std::ranges::view_interface<D>
)
|
|
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_
через его инициализатор по умолчанию (
=
V
(
)
) и инициализирует по умолчанию
pred_
(что инициализирует значением содержащийся
Pred
).
base_
с помощью
std
::
move
(
base
)
и инициализирует
pred_
с помощью
std
::
move
(
pred
)
.
Параметры
| base | - | диапазон для фильтрации |
| pred | - | предикат для фильтрации элементов |
std::ranges::filter_view:: base
|
constexpr
V base
(
)
const
&
requires
std::
copy_constructible
<
V
>
;
|
(1) | (since C++20) |
|
constexpr
V base
(
)
&&
;
|
(2) | (since C++20) |
std::ranges::filter_view:: pred
|
constexpr
const
Pred
&
pred
(
)
const
;
|
(since 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
( демонстрационный класс-член* ) |
|
тип сторожа для
filter_view
когда базовое представление не является
common_range
( демонстрационный класс-член* ) |
Пример
#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
, конструктор по умолчанию
создаёт
filter_view
, который не содержит
Pred
|
filter_view
также
не
default_initializable
|
Смотрите также
представление, состоящее из начальных элементов другого
view
, до первого элемента, для которого предикат возвращает
false
(шаблон класса) (объект адаптера диапазона) |