Spec-Zone.ru › C++

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

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

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

Этот итератор является двунаправленным итератором, если V соответствует двунаправленному диапазону, прямым итератором, если V соответствует прямому диапазону, и входным итератором в противном случае.

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

Типы членов

Тип члена Определение
iterator_concept
  • std::bidirectional_iterator_tag, если V соответствует двунаправленному диапазону,
  • std::forward_iterator_tag, если V соответствует прямому итератору,
  • std::input_iterator_tag в противном случае.
iterator_category

Определяется тогда и только тогда, когда V соответствует прямому диапазону. Пусть 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>

Члены данных

Название члена Определение
current_ (private) Итератор типа ranges::iterator_t<V> в базовом view.
(только для примера*)
parent_ (private) Указатель типа ranges::filter_view<V, Pred>* на родительский объект filter_view.
(только для примера*)

Члены-функции

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

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++.

DR Применено к Поведение, как опубликовано Корректное поведение
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/w/cpp/ranges/filter_view/iterator

Spec-Zone.ru

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