Spec-Zone.ru › C++

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 могло быть некорректным сделано явным

См. также

ranges::take_viewviews::take
(C++20)
view, состоящее из первых N элементов другого view
(шаблон класса) (объект адаптера диапазона)
ranges::subrange
(C++20)
объединяет пару «итератор — sentinel» в view
(шаблон класса)
counted_iterator
(C++20)
адаптер итератора, отслеживающий расстояние до конца диапазона
(шаблон класса)
ranges::countranges::count_if
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API