Spec-Zone.ru › C++

std::counted_iterator

Определено в заголовке <iterator>
template< std::input_or_output_iterator I >
class counted_iterator;
(с C++20)

std::counted_iterator — это адаптер итератора, который ведет себя точно так же, как и базовый итератор, за исключением того, что он отслеживает расстояние до конца области. Этот итератор равен std::default_sentinel только в том случае, если его счётчик достигает нуля.

Типы членов

Тип члена Определение
iterator_type I
value_type std::iter_value_t<I> если I соответствует indirectly_readable; в противном случае не определено
difference_type std::iter_difference_t<I>
iterator_concept I::iterator_concept если присутствует; в противном случае не определено
iterator_category I::iterator_category если присутствует; в противном случае не определено

Объекты-члены

Название члена Определение
current (private) базовый итератор, к которому base() имеет доступ
(объект-член только для экспозиции*)
length (private) расстояние между базовым итератором и концом области
(объект-член только для экспозиции*)

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

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

Функции вне класса

operator==operator<=>
(C++20)
сравнивает расстояния до конца
(шаблон функции)
operator==(std::default_sentinel)
(C++20)
проверяет, равно ли расстояние до конца ​0​
(шаблон функции)
operator+
(C++20)
перемещает итератор вперёд
(шаблон функции)
operator-
(C++20)
вычисляет расстояние между двумя адаптерами итераторов
(шаблон функции)
operator-(std::default_sentinel_t)
(C++20)
вычисляет относительное расстояние до конца
(шаблон функции)
iter_move
(C++20)
преобразует результат обращение к базовому итератору к соответствующему типу rvalue-ссылки
(функция)
iter_swap
(C++20)
меняет местами объекты, на которые указывают два базовых итератора
(шаблон функции)

Вспомогательные классы

std::iterator_traits<std::counted_iterator>
(C++20)
предоставляет унифицированный интерфейс к свойствам типа std::counted_iterator
(специализация шаблона класса)

Пример

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
 
using std::operator""s;
 
void print(auto const remark, auto const& v)
{
    const auto size = std::ssize(v);
    std::cout << remark << '[' << size << "] { ";
    for (auto it = std::counted_iterator{std::cbegin(v), size};
         it != std::default_sentinel; ++it)
        std::cout << *it << (it.count() > 1 ? ", " : " ");
    std::cout << "}\n";
}
 
int main()
{
    const auto src = {"Arcturus"s, "Betelgeuse"s, "Canopus"s, "Deneb"s, "Elnath"s};
    print("src", src);
    std::vector<decltype(src)::value_type> dst;
    std::ranges::copy(std::counted_iterator{src.begin(), 3},
                      std::default_sentinel,
                      std::back_inserter(dst));
    print("dst", dst);
}

Вывод:

src[5] { Arcturus, Betelgeuse, Canopus, Deneb, Elnath }
dst[3] { Arcturus, Betelgeuse, Canopus }

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

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

DR Применено к Опубликованное поведение Правильное поведение
P2259R1 C++20 типы-члены не предоставлены std::incrementable_traits
специализируется для counted_iterator
типы-члены добавлены для учёта iterator_traits исправления
избыточная std::incrementable_traits специализация удалена

См. также

default_sentinel_t
(C++20)
стандартный конечный итератор для использования с итераторами, которые знают границы своего диапазона
(класс)
views::counted
(C++20)
создаёт поддиапазон из итератора и количества элементов
(объект кастомизации)
ranges::take_viewviews::take
(C++20)
view содержащий первые N элементов другого view
(шаблон класса) (объект адаптера диапазонов)

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

Spec-Zone.ru

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