диапазон произвольного доступа известного размера
template< class T >
concept /*sized-random-access-range*/ =
ranges::random_access_range<T> &&
ranges::sized_range<T>;
|
(начиная с C++26) (только для экспозиции*) |
Концепт, используемый только для экспозиции, sized-random-access-range задаёт требования к типу range, который знает свой размер за постоянное время и предоставляет произвольный доступ к своим элементам.
Примечания
sized-random-access-range используется параллельными алгоритмами для диапазонов, чтобы отклонять аргументы в виде неограниченных диапазонов. Причины этого следующие:
- Для эффективной параллельной реализации необходимо знать границы пространства итераций. В противном случае сложно применить стратегию «разделяй и властвуй» для распределения работы между несколькими потоками выполнения.
- Хотя последовательные алгоритмы для диапазонов допускают передачу «бесконечного» диапазона, например
std::ranges::views::iota(0), это может привести к бесконечному циклу. Сложно представить, какую пользу это может принести при параллельном выполнении. Требование к ограниченности последовательностей данных потенциально позволяет предотвращать ошибки во время выполнения. - Использование явно ограниченных выходных диапазонов соответствует сложившимся практикам безопасного программирования, которые рекомендуют или даже требуют всегда указывать размер выходных данных, чтобы предотвратить модификацию данных за пределами диапазона.
- Если несколько входных диапазонов или последовательностей ограничены, алгоритм обычно должен остановиться, как только будет достигнут конец самого короткого из них. В стандарте уже есть примеры алгоритмов, которые принимают две последовательности, потенциально имеющие разные размеры, и выбирают меньший размер в качестве числа итераций, например
std::ranges::transformиstd::ranges::mismatch. - Поскольку выходные последовательности данных ограничены, больше не предполагается, что в них достаточно места для всех входных данных. Поэтому возможно, что алгоритм обработает не все элементы входных последовательностей, и имеет смысл возвращать итераторы на позиции в этих последовательностях, где обработка остановилась.
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/sized-random-access-range