std::ranges::views::filter, std::ranges::filter_view
Определено в заголовке <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 /* unspecified */ filter = /* unspecified */;
}
| (2) | (с C++20) |
| Подпись вызова | ||
template< ranges::viewable_range R, class Pred >
requires /* see below */
constexpr ranges::view auto filter( R&& r, Pred&& pred );
| (с C++20) | |
template< class Pred > constexpr /* range adaptor closure */ filter( Pred&& pred ); | (с C++20) |
view базовой последовательности без элементов, которые не удовлетворяют предикату.views::filter(e, p) эквивалентно выражению filter_view(e, p) для любых подходящих подвыражений e и p.filter_view моделирует концепции bidirectional_range, forward_range, input_range и common_range, когда базовый view V моделирует соответствующие концепции.
Члены данных
| Имя члена | Определение |
|---|---|
base_ (private) | Базовый view типа V.(член объекта только для демонстрации*) |
pred_ (private) | Оборачивает предикат, используемый для фильтрации элементов base_ типа copyable-box<Pred>(до C++23)movable-box<Pred>(с C++23) дополняя Pred присваиваемостью при необходимости и, следовательно, всегда удовлетворяет copyable или movable(с C++23).(член объекта только для демонстрации*) |
begin_ (private) (необязательно) | Объект типа подобного optional, который кеширует итератор к первому элементу base_, который удовлетворяет pred_. Существует только если filter_view моделирует forward_range.(член объекта только для демонстрации*) |
Члены-функции
|
(C++20) | создаёт filter_view (публичная функция-член) |
|
(C++20) | возвращает базовый просмотр V (публичная функция-член) |
|
(C++20) | возвращает ссылку на предикат, хранящийся внутри filter_view (публичная функция-член) |
|
(C++20) | возвращает итератор начала filter_view (публичная функция-член) |
|
(C++20) | возвращает стоп-значение filter_view (публичная функция-член) |
Унаследовано от |
|
|
(C++20) | возвращает, пуст ли производный вид. Предоставляется, если он удовлетворяет sized_range или forward_range. (публичная функция-член std::ranges::view_interface<D> ) |
|
(C++23) | возвращает константный итератор начала диапазона. (публичная функция-член std::ranges::view_interface<D> ) |
|
(C++23) | возвращает стоп-значение для константного итератора диапазона. (публичная функция-член std::ranges::view_interface<D> ) |
|
(C++20) | возвращает, пуст ли производный вид. Предоставляется, если для него применим ranges::empty. (публичная функция-член std::ranges::view_interface<D> ) |
|
(C++20) | возвращает первый элемент в производном виде. Предоставляется, если он удовлетворяет forward_range. (публичная функция-член std::ranges::view_interface<D> ) |
|
(C++20) | возвращает последний элемент в производном виде. Предоставляется, если он удовлетворяет 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) | (с C++20) |
constexpr explicit filter_view( V base, Pred pred ); | (2) | (с 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) |
return base_;.return std::move(base_);. 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(); | (since 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>; | (since C++20) |
Вложенные классы
|
(C++20) | тип итератора для filter_view(только для иллюстрации*) |
|
(C++20) | тип конечной точки для 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 | конструктор с несколькими параметрами не был явным | сделан явным |
| P2325R3 | C++20 | если Pred не является default_initializable, конструктор по умолчаниюсоздаёт filter_view который не содержит Pred | filter_view такжене является default_initializable |
См. также
|
(C++20) | view состоящий из начальных элементов другого view, до первого элемента, на котором предикат возвращает false(шаблон класса) (объект адаптера диапазонов) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/filter_view