Spec-Zone.ru › C++

std::ranges::filter_view<V,Pred>::iterator

class /*iterator*/;
(начиная с C++20)
(только для описания*)

Тип возвращаемого значения filter_view::begin.

Это bidirectional_iterator, если V моделирует bidirectional_range, forward_iterator, если V моделирует forward_range, и в противном случае input_iterator.

Изменение элемента, на который указывает этот итератор, разрешено, однако приводит к неопределённому поведению, если полученное значение не удовлетворяет предикату фильтра.

Типы-члены

Тип Определение
iterator_concept
  • std::bidirectional_iterator_tag, если V моделирует bidirectional_range,
  • std::forward_iterator_tag, если V моделирует forward_iterator,
  • std::input_iterator_tag в противном случае.
iterator_category
(присутствует только если V моделирует
forward_range)

Пусть C — тип std::iterator_traits<ranges::iterator_t<V>>::iterator_category.

  • std::bidirectional_iterator_tag, если C моделирует std::derived_from<std::bidirectional_iterator_tag>,
  • std::forward_iterator_tag, если C моделирует std::derived_from<std::forward_iterator_tag>,
  • C в противном случае.
value_type ranges::range_value_t<V>
difference_type ranges::range_difference_t<V>

Поля данных

Член Описание
ranges::iterator_t<V> current_ (закрытый) итератор базового view
(объект-член, используемый только для описания*)
ranges::filter_view<V,Pred>* parent_ (закрытый) указатель на родительский объект filter_view
(объект-член, используемый только для описания*)

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

(конструктор)
создаёт итератор
(открытая функция-член)
base
возвращает базовый итератор
(открытая функция-член)
operator*operator->
перенаправляет вызов базовому итератору
(открытая функция-член)
operator++operator++(int)
перемещает итератор вперёд
(открытая функция-член)
operator--operator--(int)
перемещает итератор назад
(открытая функция-член)

std::ranges::filter_view::iterator::iterator

/*iterator*/()
    requires std::default_initializable<ranges::iterator_t<V>> = default;
(1) (начиная с C++20)
constexpr /*iterator*/( filter_view& parent,
                        ranges::iterator_t<V> current );
(2) (начиная с C++20)
1) Инициализирует current_ и parent_ их инициализаторами членов по умолчанию, то есть соответственно = ranges::iterator_t<V>() и = nullptr.
2) Инициализирует current_ значением std::move(current), а parent_ — значением std::addressof(parent).

std::ranges::filter_view::iterator::base

constexpr const ranges::iterator_t<V>& base() const & noexcept;
(1) (начиная с C++20)
constexpr ranges::iterator_t<V> base() &&;
(2) (начиная с C++20)
1) Эквивалентно return current_;.
2) Эквивалентно return std::move(current_);.

std::ranges::filter_view::iterator::operator*,->

constexpr ranges::range_reference_t<V> operator*() const;
(1) (начиная с C++20)
constexpr ranges::iterator_t<V> operator->() const
    requires /*has-arrow*/<ranges::iterator_t<V>> &&
             std::copyable<ranges::iterator_t<V>>;
(2) (начиная с C++20)
1) Эквивалентно return *current_;.
2) Эквивалентно return current_;.

Для типа I, /*has-arrow*/<I> моделируется или удовлетворяется тогда и только тогда, когда I соответственно моделирует или удовлетворяет input_iterator, а также I является типом указателя или requires(I i){ i.operator->();} является true.

std::ranges::filter_view::iterator::operator++

constexpr /*iterator*/& operator++();
(1) (начиная с C++20)
constexpr void operator++( int );
(2) (начиная с C++20)
constexpr /*iterator*/ operator++( int )
    requires ranges::forward_range<V>;
(3) (начиная с C++20)
1) Эквивалентно
current_ = ranges::find_if(std::move(++current_), ranges::end(parent_->base_),std::ref(*parent_->pred_));return *this;.
2) Эквивалентно ++*this;.
3) Эквивалентно auto tmp = *this; ++*this; return tmp;.

std::ranges::filter_view::iterator::operator--

constexpr /*iterator*/& operator--()
    requires ranges::bidirectional_range<V>;
(1) (начиная с C++20)
constexpr /*iterator*/ operator--( int )
    requires ranges::bidirectional_range<V>;
(2) (начиная с C++20)
1) Эквивалентно
do--current_;while (!std::invoke(*parent_->pred_, *current_));return *this;.
2) Эквивалентно auto tmp = *this; --*this; return tmp;.

Функции, не являющиеся членами

operator==
(C++20)
сравнивает базовые итераторы
(функция)
iter_move
(C++20)
приводит результат разыменования базового итератора к соответствующему типу ссылки на rvalue
(функция)
iter_swap
(C++20)
меняет местами объекты, на которые указывают два базовых итератора
(функция)

operator==(std::ranges::filter_view::iterator)

friend constexpr bool operator==( const /*iterator*/& x, const /*iterator*/& y )
    requires std::equality_comparable<ranges::iterator_t<V>>;
(начиная с C++20)

Эквивалентно return x.current_ == y.current_;.

Оператор != синтезируется из operator==.

Эта функция не видна при обычном поиске без квалификации или поиске с квалификацией; найти её можно только посредством поиска с зависимостью от аргументов, если std::ranges::filter_view::iterator является ассоциированным классом аргументов.

iter_move(std::ranges::filter_view::iterator)

friend constexpr ranges::range_rvalue_reference_t<V>
iter_move( const /*iterator*/& i )
    noexcept(noexcept(ranges::iter_move(i.current_)));
(начиная с C++20)

Эквивалентно return ranges::iter_move(i.current_);.

Эта функция не видна при обычном поиске без квалификации или поиске с квалификацией; найти её можно только посредством поиска с зависимостью от аргументов, если std::ranges::filter_view::iterator является ассоциированным классом аргументов.

iter_swap(std::ranges::filter_view::iterator)

friend constexpr void iter_swap( const /*iterator*/& x, const /*iterator*/& y )
    noexcept(noexcept(ranges::iter_swap(x.current_, y.current_)))
        requires std::indirectly_swappable<ranges::iterator_t<V>>;
(начиная с C++20)

Эквивалентно ranges::iter_swap(x.current_, y.current_).

Эта функция не видна при обычном поиске без квалификации или поиске с квалификацией; найти её можно только посредством поиска с зависимостью от аргументов, если std::ranges::filter_view::iterator является ассоциированным классом аргументов.

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

Отчёт об ошибке Применяется к Опубликованное поведение Корректное поведение
P2259R1 C++20 тип-член iterator_category всегда был определён определён, только если V является forward_range
LWG 3533 C++20 перегрузка const& для base копировала базовый итератор возвращает ссылку на него
LWG 3593 C++20 перегрузка const& для base могла не иметь спецификатора noexcept добавлен noexcept

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/filter_view/iterator

Spec-Zone.ru

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