Пространства имён
Варианты
Действия

cpp/ranges/view counted

Материал из cppreference.com
< cpp‎ | ranges

Шаблон:cpp/ranges/views/title

 
 
Библиотека диапазонов
Доступ к диапазонам
Преобразования диапазонов
(C++23)

Примитивы диапазонов



Обработка висячих итераторов
Концепты диапазонов
Представления

Фабрики диапазонов
Адаптеры диапазонов
Генераторы диапазонов
Объекты адаптеров диапазонов
Объекты замыкания адаптеров диапазонов
Вспомогательные элементы
(до C++23)(C++23)


 
Определено в заголовочном файле <ranges>
inline constexpr /*unspecified*/ counted = /*unspecified*/;
(начиная с C++20)
Сигнатура вызова
template< class Iterator, class DifferenceType >

    requires /* see below */

constexpr /*span-or-subrange*/ counted( Iterator&& it, DifferenceType&& count );
(начиная с C++20)

Подсчитанное представление является view элементов подсчитанного диапазона [in) для некоторого итератора i и неотрицательного целого n.

Подсчитанный диапазон [in) представляет из себя n элементов, начинающихся с элемента, на который указывает i до (не включительно) элемента на который указывает результат n применений ++i.

Если n == 0, подсчитанный диапазон действителен и пуст. В противном случае подсчитанный диапазон действителен только в том случае, если n является позитивным, i является разыменуемым, и [++i--n) является допустимым подсчитанным диапазоном.

Формально, если it и count являются выражениями, а T является std::decay_t<decltype((it))>, и D является std::iter_difference_t<T>, тогда

если T моделирует input_or_output_iterator и decltype((count)) моделирует std::convertible_to<D>,
иначе, views::counted(it, count) неправильно сформирован.

Содержание

Объекты точек настройки

Имя views::counted обозначает объект точки настройки, который является константным функциональным объектом литерального классового типа semiregular. В целях наглядности версия этого типа без cv-квалификации обозначается как __counted_fn.

Все экземпляры __counted_fn равны. Эффекты от вызова разных экземпляров типа __counted_fn для одних и тех же аргументов эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и является ли оно константным или нет (однако volatile-квалифицированный экземпляр не требуется для вызова). Таким образом, views::counted можно свободно копировать, а его копии можно использовать взаимозаменяемо.

Учитывая набор типов Args..., если std::declval<Args>()... соответствует требованиям к аргументам для views::counted выше, __counted_fn модели

Иначе, оператор вызова функции __counted_fn не участвует в разрешении перегрузки.

[править] Заметки

views::counted не проверяет, достаточен ли диапазон для предоставления всех count элементов: используйте views::take если такая проверка необходима.

[править] Пример

#include <iostream>
#include <ranges>
 
int main()
{
    const int a[]{1, 2, 3, 4, 5, 6, 7};
    for (int i : std::views::counted(a, 3))
        std::cout << i << ' ';
    std::cout << '\n';
 
    const auto il = {1, 2, 3, 4, 5};
    for (int i : std::views::counted(il.begin() + 1, 3))
        std::cout << i << ' ';
    std::cout << '\n';
}

Вывод:

1 2 3
2 3 4

[править] Отчеты об ошибках

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
WG не указан C++20 неявное преобразование из типа целочисленного класса в std::size_t может быть невалидным сделано explicit

[править] Смотри также

view, состоящий из первых N элементов другого view
(шаблон класса) (объект адаптера диапазона) [править]
объединяет пару итератор-ограничитель в view
(шаблон класса) [править]
адаптер итератора, отслеживающий расстояние до конца диапазона
(шаблон класса) [править]
возвращает количество элементов, соответствующих определённым критериям
(ниблоид) [править]