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 (открытая функция-член) |
|
присваивает другой counted_iterator (открытая функция-член) |
|
| получает доступ к базовому итератору (открытая функция-член) |
|
| возвращает расстояние до конца (открытая функция-член) |
|
| получает доступ к элементу, на который указывает итератор (открытая функция-член) |
|
| получает доступ к элементу по индексу (открытая функция-член) |
|
перемещает counted_iterator вперёд или назад (открытая функция-член) |
Функции вне класса
|
(C++20) | сравнивает расстояния до конца (шаблон функции) |
|
(C++20) | проверяет, равно ли расстояние до конца 0 (шаблон функции) |
|
(C++20) | перемещает итератор вперёд (шаблон функции) |
|
(C++20) | вычисляет расстояние между двумя адаптерами итератора (шаблон функции) |
|
(C++20) | вычисляет знаковое расстояние до конца (шаблон функции) |
|
(C++20) | приводит результат разыменования базового итератора к соответствующему типу rvalue-ссылки (функция) |
|
(C++20) | меняет местами объекты, на которые указывают два базовых итератора (шаблон функции) |
Вспомогательные классы
|
(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 удалена |
См. также
|
(C++20) | сторожевое значение по умолчанию для использования с итераторами, которым известна граница диапазона (класс) |
|
(C++20) | создаёт поддиапазон на основе итератора и счётчика (объект точки настройки) |
|
(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