Поделиться через


filter_view class (стандартная библиотека C++)

Представление, отфильтровывающее элементы диапазона, которые не соответствуют предикату.

Синтаксис

template<ranges::input_range V, indirect_unary_predicate<iterator_t<V>> Pred>
    requires view<V> && is_object_v<Pred>
class filter_view : public view_interface<filter_view<V, Pred>>;

Параметры шаблона

V
Тип базового диапазона.

Pred
Тип предиката, определяющего, какие элементы следует хранить.

Просмотр характеристик

Описание следующих записей см. в разделе "Просмотр характеристик класса"

Characteristic Description
Адаптер диапазона views::filter
Базовый диапазон Должно соответствовать input_range или выше
Тип элемента Совпадает с базовым диапазоном
Просмотр категории итератора input_range, forward_rangeили bidirectional_range в зависимости от базового диапазона
Размер No
Is const-iterable No
Общий диапазон Только если базовый диапазон удовлетворяет common_range
Заимствуемый диапазон Только если базовый диапазон удовлетворяет borrowed_range

Участники

Функции-члены Description
КонструкторыC++20 Создайте представление.
baseC++20 Получение базового диапазона.
beginC++20 Получите итератор к первому элементу.
endC++20 Получите sentinel в конце представления.
predC++20 Получите ссылку на предикат, определяющий, какие элементы нужно удалить.
Наследуется от view_interface Description
backC++20 Получите последний элемент.
emptyC++20 Проверьте, является ли представление пустым.
frontC++20 Получите первый элемент.
operator boolC++20 Проверьте, не является ли представление пустым.

Требования

Заголовок: <ranges> (с C++20)

Пространство имен: std::ranges

Параметр компилятора: /std:c++20 или более поздней версии требуется.

Конструкторы

Создание экземпляра объекта filter_view

1) constexpr filter_view(V base, P pred);
2) filter_view() requires default_initializable<V> && default_initializable<Pred> = default;

Параметры

base
Базовое представление.

pred
Предикат, определяющий, какие элементы следует хранить в базовом представлении.

Сведения о типах параметров шаблона см. в разделе "Параметры шаблона".

Возвращаемое значение

Экземпляр класса filter_view.

Замечания

Лучший способ создания filter_view — использовать views::filter адаптер диапазона. Адаптеры диапазона — это способ создания классов представления. Типы представлений предоставляются в случае, если вы хотите создать собственный тип пользовательского представления.

1) Создание инициализированного filter_viewзначения. Предикат и базовое представление должны быть инициализируемыми по умолчанию.
2) Перемещение конструкций filter_view base из представления и pred предиката. Оба base и pred перемещаются через std::move().

Пример: filter_view

// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>

void print(auto v)
{
    for (auto& x : v)
    {
        std::cout << x << ' ';
    }
    std::cout << '\n';
}

int main()
{
    std::vector<int> v{0, 1, -2, 3, -4, -5, 6};
    auto myView = std::views::filter(v, [](int i) {return i > 0; });
    print(myView); // outputs 1 3 6

    auto myView2 = v | std::views::filter([](int i) {return i < 3; });
    print(myView2); // outputs 0 1 -2 -4 -5
}
1 3 6
0 1 -2 -4 -5

base

Возвращает базовый диапазон.

// Uses a copy constructor to return the underlying range
constexpr V base() const& requires std::copy_constructible<V>;

// Uses std::move() to return the underlying range
constexpr V base() &&;

Параметры

Нет.

Возвраты

Базовое представление.

begin

Получите итератор к первому элементу в представлении.

constexpr auto begin();

Возвращаемое значение

Итератор, указывающий на первый элемент в представлении. Поведение не определено, если представление не имеет предиката.

Изображение вектора с элементами 10, 20 и 30. Первый элемент содержит 10 и помечен как begin(). Последний элемент содержит 30 и помечен как последний элемент. Мнимый прямоугольник после последнего элемента указывает sentinel и обозначает конец().

end

Получите sentinel в конце представления.

constexpr auto end()

Возвращаемое значение

Sentinel, следующий за последним элементом в представлении:

Изображение вектора с элементами 10, 20 и 30. Первый элемент содержит 10 и помечен как begin(). Последний элемент содержит 30 и помечен как последний элемент. Мнимый прямоугольник после последнего элемента указывает sentinel и обозначает конец().

pred

Получите ссылку на предикат, определяющий, какие ведущие элементы нужно удалить.

constexpr const Pred& pred() const;

Возвращаемое значение

Ссылка на предикат.

Замечания

Если класс не хранит предикат, поведение не определено.

Пример: pred.

// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v{0, 1, 2, 3, -4, 5, 6};
    auto mv = v | std::views::filter(
        [](int i) {return i < 5; }); // keep the elements < 5
    
    std::cout << std::boolalpha << mv.pred()(v[6]); // outputs "false" because v[6] = 6 and 6 is not less than 5 (the predicate)
}

См. также

<ranges>
filter адаптер диапазона
drop_while()
take_while()
Классы представления