cpp/ranges/view counted
| Определено в заголовочном файле <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 элементов подсчитанного диапазона [i, n) для некоторого итератора i и неотрицательного целого n.
Подсчитанный диапазон [i, n) представляет из себя 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>,- если
Tмоделируетcontiguous_iterator, тогдаviews::counted(it, count)является expression-equivalent дляstd::span(std::to_address(it), static_cast<std::size_t>(static_cast<D>(count))), - иначе, если
Tмоделируетrandom_access_iterator, тогдаviews::counted(it, count)является expression-equivalent дляranges::subrange(it, it + static_cast<D>(count)), - иначе,
views::counted(it, count)является expression-equivalent дляranges::subrange(std::counted_iterator(it, count), std::default_sentinel).
- если
- иначе,
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 модели
std::invocable<__counted_fn, Args...>,std::invocable<const __counted_fn, Args...>,std::invocable<__counted_fn&, Args...>иstd::invocable<const __counted_fn&, Args...>.
Иначе, оператор вызова функции __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 |
Смотри также
(C++20) |
view, состоящий из первых N элементов другого view (шаблон класса) (объект адаптера диапазона) |
(C++20) |
объединяет пару итератор-ограничитель в view (шаблон класса) |
(C++20) |
адаптер итератора, отслеживающий расстояние до конца диапазона (шаблон класса) |
(C++20)(C++20) |
возвращает количество элементов, соответствующих определённым критериям (ниблоид) |