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) RangeAdaptorObject. Выражение 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
(публичная функция-член)
base
(C++20)
возвращает базовый просмотр V
(публичная функция-член)
pred
(C++20)
возвращает ссылку на предикат, хранящийся внутри filter_view
(публичная функция-член)
begin
(C++20)
возвращает итератор начала filter_view
(публичная функция-член)
end
(C++20)
возвращает стоп-значение filter_view
(публичная функция-член)
Унаследовано от std::ranges::view_interface
empty
(C++20)
возвращает, пуст ли производный вид. Предоставляется, если он удовлетворяет sized_range или forward_range.
(публичная функция-член std::ranges::view_interface<D> )
cbegin
(C++23)
возвращает константный итератор начала диапазона.
(публичная функция-член std::ranges::view_interface<D> )
cend
(C++23)
возвращает стоп-значение для константного итератора диапазона.
(публичная функция-член std::ranges::view_interface<D> )
operator bool
(C++20)
возвращает, пуст ли производный вид. Предоставляется, если для него применим ranges::empty.
(публичная функция-член std::ranges::view_interface<D> )
front
(C++20)
возвращает первый элемент в производном виде. Предоставляется, если он удовлетворяет forward_range.
(публичная функция-член std::ranges::view_interface<D> )
back
(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)
1) Инициализирует base_ через его инициализатор по умолчанию (= V()) и инициализирует pred_ (которое инициализирует содержащий Pred) по умолчанию.
2) Инициализирует base_ значением std::move(base) и инициализирует pred_ значением std::move(pred).

Параметры

base - диапазон для фильтрации
pred - предикат для фильтрации элементов
END_OF_DOCUMENT_MARKER

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();
(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)

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

iterator
(C++20)
тип итератора для filter_view
(только для иллюстрации*)
sentinel
(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

См. также

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/w/cpp/ranges/filter_view

Spec-Zone.ru

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