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 типа класса. Для целей пояснения, неквалифицированная версия его типа обозначается как __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 может быть недопустимым сделано явным

См. также

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

Spec-Zone.ru

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