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