cpp/ranges/view counted
Определено в заголовочном файле <ranges>
|
||
inline constexpr /*unspecified*/ counted = /*unspecified*/; |
(начиная с C++20) | |
Сигнатура вызова |
||
template< class Iterator, class DifferenceType > requires /* see below */ |
(начиная с 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) |
возвращает количество элементов, соответствующих определённым критериям (ниблоид) |