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 (закрытый) базовый итератор, к которому обращается base()
(объект-член, используемый только для описания*)
length (закрытый) расстояние между базовым итератором и концом его диапазона
(объект-член, используемый только для описания*)

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

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

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

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/cpp/iterator/counted_iterator

Spec-Zone.ru

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