Namespaces
Variants

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

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

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)
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
(шаблон класса) (объект адаптера диапазона)