std::ranges::views::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) |
Вид counted представляет 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)эквивалентно выражениюstd::span(std::to_address(it), static_cast<std::size_t>(static_cast<D>(count))), - в противном случае, если
Tмоделируетrandom_access_iterator, тоviews::counted(it, count)эквивалентно выражениюranges::subrange(it, it + static_cast<D>(count)), - в противном случае,
views::counted(it, count)эквивалентно выражениюranges::subrange(std::counted_iterator(it, count), std::default_sentinel).
- если
- В противном случае,
views::counted(it, count)некорректно.
Объекты точек кастомизации
Имя views::counted обозначает объект точки кастомизации, который представляет собой const функциональный объект от литерального semiregular типа класса. Для целей пояснения, неквалифицированная версия его типа обозначается как __counted_fn.
Все экземпляры __counted_fn равны. Эффекты вызова различных экземпляров типа __counted_fn с одними и теми же аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и квалифицирован ли он как const (однако, экземпляр с квалификацией 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++.
| DR | Применяется к | Поведение, опубликованное | Правильное поведение |
|---|---|---|---|
| P2393R1 | C++20 | неявное преобразование из типа целого числа в std::size_t может быть недопустимым | сделано явным |
См. также
|
(C++20) | view состоящий из первых N элементов другого view(шаблон класса) (объект адаптера диапазона) |
|
(C++20) | объединяет пару итератор-финальный итератор в view (шаблон класса) |
|
(C++20) | адаптер итератора, отслеживающий расстояние до конца диапазона (шаблон класса) |
|
(C++20)(C++20) | возвращает количество элементов, удовлетворяющих определённым критериям (niebloid) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/view_counted