Spec-Zone.ru › C++

std::counted_iterator<I>::operator++,+,+=,--,-,-=

constexpr counted_iterator& operator++();
(1) (с C++20)
constexpr decltype(auto) operator++( int );
(2) (с C++20)
constexpr counted_iterator operator++( int )
    requires std::forward_iterator<I>;
(3) (с C++20)
constexpr counted_iterator& operator--()
    requires std::bidirectional_iterator<I>;
(4) (с C++20)
constexpr counted_iterator operator--( int )
    requires std::bidirectional_iterator<I>;
(5) (с C++20)
constexpr counted_iterator operator+( std::iter_difference_t<I> n ) const
    requires std::random_access_iterator<I>;
(6) (с C++20)
constexpr counted_iterator& operator+=( std::iter_difference_t<I> n )
    requires std::random_access_iterator<I>;
(7) (с C++20)
constexpr counted_iterator operator-( std::iter_difference_t<I> n ) const
    requires std::random_access_iterator<I>;
(8) (с C++20)
constexpr counted_iterator& operator-=( std::iter_difference_t<I> n )
    requires std::random_access_iterator<I>;
(9) (с C++20)

Увеличивает или уменьшает базовый итератор current и расстояние до конца length .

1) Префиксный инкремент на единицу. Эквивалентно ++current; --length; return *this;.

Если count() > 0 равно false, поведение не определено.

(до C++26)

Если count() > 0 равно false:

  • Если реализация является защищённой, происходит нарушение контракта.
  • Если реализация не является защищённой, поведение не определено.
(с C++26)
2) Постфиксный инкремент на единицу. Эквивалентно --length; try { return current++; } catch(...) { ++length; throw; }.

Если count() > 0 равно false, поведение не определено.

(до C++26)

Если count() > 0 равно false:

  • Если реализация является защищённой, происходит нарушение контракта.
  • Если реализация не является защищённой, поведение не определено.
(с C++26)
3) Постфиксный инкремент на единицу. Эквивалентно counted_iterator temp{*this}; ++*this; return temp;.
4) Префиксный декремент на единицу. Эквивалентно --current; ++length; return *this;.
5) Постфиксный декремент на единицу. Эквивалентно counted_iterator temp{*this}; --*this; return temp;.
6) Возвращает адаптер итератора, сдвинутый на n. Эквивалентно return counted_iterator(current + n, length - n);.
7) Сдвигает адаптер итератора на n. Эквивалентно current += n; length -= n; return *this;.

Если count() >= n равно false, поведение не определено.

(до C++26)

Если count() >= n равно false:

  • Если реализация является защищённой, происходит нарушение контракта.
  • Если реализация не является защищённой, поведение не определено.
(с C++26)
8) Возвращает адаптер итератора, сдвинутый на -n. Эквивалентно return counted_iterator(current - n, length + n);.
9) Сдвигает адаптер итератора на -n. Эквивалентно current -= n; length += n; return *this;.

Если count() >= -n равно false, поведение не определено.

(до C++26)

Если count() >= -n равно false:

  • Если реализация является защищённой, происходит нарушение контракта.
  • Если реализация не является защищённой, поведение не определено.
(с C++26)

Параметры

n - количество позиций, на которое нужно увеличить или уменьшить адаптер итератора

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

1) *this
2,3) Копия *this, созданная до изменения.
4) *this
5) Копия *this, созданная до изменения.
6) Адаптер итератора, сдвинутый на n.
7) *this
8) Адаптер итератора, сдвинутый на -n.
9) *this

Пример

#include <cassert>
#include <initializer_list>
#include <iterator>

int main()
{
    const auto v = {1, 2, 3, 4, 5, 6};
    std::counted_iterator<std::initializer_list<int>::iterator> it1{v.begin(), 5};
    
    ++it1;              assert(*it1 == 2 && it1.count() == 4); // (1)
    auto it2 = it1++;   assert(*it2 == 2 && *it1 == 3);        // (3)
    --it1;              assert(*it1 == 2 && it1.count() == 4); // (4)
    auto it3 = it1--;   assert(*it3 == 2 && *it1 == 1);        // (5)
    auto it4 = it1 + 3; assert(*it4 == 4 && it4.count() == 2); // (6)
    auto it5 = it4 - 3; assert(*it5 == 1 && it5.count() == 5); // (8)
    it1 += 3;           assert(*it1 == 4 && it1.count() == 2); // (7)
    it1 -= 3;           assert(*it1 == 1 && it1.count() == 5); // (9)
}

См. также

operator+
(C++20)
сдвигает итератор
(шаблон функции)
operator-
(C++20)
вычисляет расстояние между двумя адаптерами итератора
(шаблон функции)

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

Spec-Zone.ru

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