std::ranges::views:: 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 ) является эквивалентным по выражению к 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
обозначает
объект точки кастомизации
, который является константным
функциональным объектом
типа
литерального
semiregular
класса. Для подробностей см.
CustomizationPointObject
.
Примечания
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)
|
возвращает количество элементов, удовлетворяющих определенным критериям
(функциональный объект алгоритма) |