Namespaces
Variants

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

С сайта ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
 
Определён в заголовочном файле <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)
1) Адаптер диапазона, который представляет собой представление исходной последовательности без элементов, не удовлетворяющих предикату.
2) RangeAdaptorObject. Выражение views::filter(e, p) является эквивалентным выражению filter_view(e, p) для любых подходящих подвыражений e и p.

filter_view удовлетворяет концепциям bidirectional_range, forward_range, input_range и common_range, когда базовое представление V удовлетворяет соответствующим концепциям.

Элементы данных

Элемент Описание
V base_ (закрытый) базовое представление
(объект-член, показанный только для пояснения*)

copyable-box<Pred>

(до C++23)

movable-box<Pred>

(начиная с C++23)
pred_ (закрытый)
содержит предикат, используемый для фильтрации элементов из base_
(объект-член, показанный только для пояснения*)
непрозрачный кеш<ranges::iterator_t<V>>
  
begin_ (закрытый)
(присутствует только если V удовлетворяет forward_range)
объект, который кеширует итератор на первый элемент base_, удовлетворяющий pred_
(объект-член, показанный только для пояснения*)

Функции-члены

конструирует filter_view
(публичная функция-член)
возвращает базовое представление V
(публичная функция-член)
возвращает ссылку на предикат, хранящийся в filter_view
(публичная функция-член)
возвращает начальный итератор filter_view
(публичная функция-член)
возвращает страж filter_view
(публичная функция-член)
Унаследовано от 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)
1) Инициализирует значением base_ через его инициализатор по умолчанию ( = V ( ) ) и инициализирует по умолчанию pred_ (что инициализирует значением содержащийся Pred ).
2) Инициализирует 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)
1) Эквивалентно return base_ ; .
2) Эквивалентно 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 ( ) ;
(начиная с 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
(шаблон класса) (объект адаптера диапазона)