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. Подробности см. в разделе 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++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| P2393R1 | C++20 | неявное преобразование из целочисленного типа класса в std::size_t могло быть некорректным | сделано явным |
См. также
|
(C++20) | view, состоящее из первых N элементов другого view(шаблон класса) (объект адаптера диапазона) |
|
(C++20) | объединяет пару «итератор — sentinel» в view (шаблон класса) |
|
(C++20) | адаптер итератора, отслеживающий расстояние до конца диапазона (шаблон класса) |
|
(C++20)(C++20) | возвращает количество элементов, удовлетворяющих заданным критериям (объект-функция алгоритма) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/view_counted