Namespaces
Variants

sized-random-access-range (диапазон с известным размером и произвольным доступом)

Сcppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 


template< class T >
concept /*sized-random-access-range*/ =
    ranges::random_access_range<T> &&
    ranges::sized_range<T>;
(начиная с C++26)
(только для пояснения*)

Концепция sized-random-access-range, предназначенная только для пояснения, определяет требования к типу диапазона, который знает свой размер за константное время и позволяет произвольный доступ к своим элементам.

Примечания

sized-random-access-range используется параллельными алгоритмами для диапазонов для отклонения аргумента в виде неограниченного диапазона. Причины этого следующие:

  • Для эффективной параллельной реализации необходимо знать границы пространства итерации. В противном случае трудно применить стратегию «разделяй и властвуй» для создания работы для нескольких потоков выполнения.
  • Хотя последовательные алгоритмы для диапазонов допускают передачу «бесконечного» диапазона, такого как std::ranges::views::iota(0), это может привести к бесконечному циклу. Трудно представить полезность этого в случае параллельного выполнения. Требование, чтобы последовательности данных были ограничены, потенциально предотвращает ошибки во время выполнения.
  • Использование явно ограниченных выходных диапазонов соответствует устоявшимся практикам безопасного кодирования, которые рекомендуют или даже требуют всегда указывать размер вывода, чтобы предотвратить модификации данных за пределами диапазона.
  • Если несколько входных диапазонов или последовательностей ограничены, алгоритм обычно должен остановиться, как только будет достигнут конец для самого короткого из них. В стандарте уже есть прецеденты, когда алгоритм принимает две последовательности с потенциально разными входными размерами и выбирает меньший размер в качестве количества итераций, которые он собирается выполнить, например std::ranges::transform и std::ranges::mismatch.
  • Поскольку выходные последовательности данных ограничены, они больше не считаются имеющими достаточное пространство для всех входных данных. Таким образом, существует вероятность того, что некоторые элементы входных последовательностей не будут обработаны алгоритмом, и имеет смысл, чтобы он возвращал итераторы на позиции в этих последовательностях, где обработка остановилась.