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) | создаёт новый адаптер итератора (публичная функция-член) |
|
(C++20) | присваивает другой адаптер итератора (публичная функция-член) |
|
(C++20) | получает доступ к базовому итератору (публичная функция-член) |
|
(C++20) | возвращает расстояние до конца (публичная функция-член) |
|
(C++20) | получает доступ к элементу, на который указывает итератор (публичная функция-член) |
|
(C++20) | получает доступ к элементу по индексу (публичная функция-член) |
|
(C++20) | перемещает итератор вперёд или назад (публичная функция-член) |
Функции вне класса
|
(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/w/cpp/iterator/counted_iterator