std:: counted_iterator
From cppreference.net
|
Определено в заголовочном файле
<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)
|
расстояние между базовым итератором и концом его диапазона
( объект-член только для демонстрации* ) |
Функции-члены
создает новый
counted_iterator
(public member function) |
|
присваивает другой
counted_iterator
(public member function) |
|
|
получает доступ к базовому итератору
(public member function) |
|
|
возвращает расстояние до конца
(public member function) |
|
|
получает доступ к указываемому элементу
(public member function) |
|
|
получает доступ к элементу по индексу
(public member function) |
|
перемещает вперед или назад
counted_iterator
(public member function) |
Функции, не являющиеся членами класса
|
(C++20)
|
сравнивает расстояния до конца
(шаблон функции) |
проверяет, равно ли расстояние до конца
0
(шаблон функции) |
|
|
(C++20)
|
продвигает итератор
(шаблон функции) |
|
(C++20)
|
вычисляет расстояние между двумя адаптерами итераторов
(шаблон функции) |
|
вычисляет знаковое расстояние до конца
(шаблон функции) |
|
|
(C++20)
|
преобразует результат разыменования базового итератора в соответствующий тип rvalue-ссылки
(функция) |
|
(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 | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| P2259R1 | C++20 |
member typedefs are not provided
std::incrementable_traits
is specialized for
counted_iterator
|
member typedefs are added to account for
iterator_traits
fix
redundant std::incrementable_traits specialization is removed |
Смотрите также
|
(C++20)
|
стандартный страж для использования с итераторами, которые знают границу своего диапазона
(класс) |
|
(C++20)
|
создаёт поддиапазон из итератора и счётчика
(объект точки кастомизации) |
|
(C++20)
|
view
состоящий из первых N элементов другого
view
(шаблон класса) (объект адаптера диапазона) |