Spec-Zone.ru › C++

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)
1) Адаптер диапазона, представляющий view базовой последовательности без элементов, не удовлетворяющих предикату.
2) Объект-адаптер диапазона. Выражение 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>

(до C++23)

movable-box<Pred>

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

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

(конструктор)
создаёт filter_view
(открытая функция-член)
base
возвращает базовое представление V
(открытая функция-член)
pred
возвращает ссылку на предикат, хранящийся в filter_view
(открытая функция-член)
begin
возвращает итератор начала filter_view
(открытая функция-член)
end
возвращает sentinel filter_view
(открытая функция-член)
Унаследовано от std::ranges::view_interface
empty
возвращает, является ли производное представление пустым; предоставляется только если оно удовлетворяет концепции sized_range или forward_range
(открытая функция-член std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор на начало диапазона
(открытая функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает sentinel для константного итератора диапазона
(открытая функция-член std::ranges::view_interface<D>)
operator bool
возвращает, не является ли производное представление пустым; предоставляется только если к нему применима ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления, если оно удовлетворяет концепции forward_range
(открытая функция-член std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления; предоставляется только если оно удовлетворяет концепциям 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)
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) (начиная с C++20)
constexpr V base() &&;
(2) (начиная с C++20)
1) Эквивалентно return base_;.
2) Эквивалентно 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)

Вложенные классы

iterator
тип итератора filter_view
(класс-член, существующий только для иллюстрации*)
sentinel
тип 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

См. также

ranges::take_while_viewviews::take_while
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API