sized-random-access-range(有大小随机访问范围)
来自 zh.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。
- 由于输出数据序列是有界的,因此不再假设它们有足够的空间容纳所有输入。因此,输入序列的某些元素可能不会被算法处理,算法返回指向这些序列中处理停止位置的迭代器是有意义的。