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 обозначает объект точки настройки, который представляет собой константный функциональный объект литерального 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) |
возвращает количество элементов, удовлетворяющих определённым критериям (алгоритмический функциональный объект) |