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 моделирует соответствующие концепции.
Поля данных
| Поле | Описание | ||||
|---|---|---|---|---|---|
V base_ (закрытое) | базовое представление (объект-член, существующий только для иллюстрации*) |
||||
pred_ (закрытое) | содержит предикат, используемый для отфильтровывания элементов из base_(объект-член, существующий только для иллюстрации*) |
||||
non-propagating-cache<ranges::iterator_t<V>>begin_ (закрытое) (присутствует только если V удовлетворяет концепции forward_range) | объект, кэширующий итератор на первый элемент base_, удовлетворяющий pred_(объект-член, существующий только для иллюстрации*) |
Функции-члены
создаёт filter_view (открытая функция-член) |
|
возвращает базовое представление V (открытая функция-член) |
|
возвращает ссылку на предикат, хранящийся в filter_view (открытая функция-член) |
|
возвращает итератор начала filter_view (открытая функция-член) |
|
возвращает sentinel filter_view (открытая функция-член) |
|
Унаследовано от |
|
возвращает, является ли производное представление пустым; предоставляется только если оно удовлетворяет концепции sized_range или forward_range (открытая функция-член std::ranges::view_interface<D>) |
|
|
(C++23) | возвращает константный итератор на начало диапазона (открытая функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает sentinel для константного итератора диапазона (открытая функция-член 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) | (начиная с 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) | (начиная с C++20) |
constexpr V base() &&; | (2) | (начиная с C++20) |
return base_;.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(класс-член, существующий только для иллюстрации*) |
|
тип sentinel для 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++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
|
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/cpp/ranges/filter_view