# C++ 具名要求：老式随机访问迭代器 (LegacyRandomAccessIterator)

< cpp‎ | named req

老式随机访问迭代器 (LegacyRandomAccessIterator) 是能在常数时间内移动到指向任何元素的老式双向迭代器 (LegacyBidirectionalIterator) 。

指向数组元素的指针满足所有老式随机访问迭代器 (LegacyRandomAccessIterator) 的要求。

### 要求

类型 `It` 满足老式随机访问迭代器 (LegacyRandomAccessIterator) ，若

- 类型 `It` 满足老式双向迭代器 (LegacyBidirectionalIterator)

且给定

- `value_type`，为 std::iterator_traits<It>::value_type 所指代的类型
- `difference_type`，为 std::iterator_traits<It>::difference_type 所指代的类型
- `reference`，为 std::iterator_traits<It>::reference 所指代的类型
- `i`、`a`、`b`，为 `It` 或 `const It` 类型的对象
- `r`，为 `It&` 类型的值
- `n`，为 `difference_type` 类型的整数

则下列表达式必须合法且拥有其指定的效果

表达式 | 返回类型 | 操作语义 | 注意
--- | --- | --- | ---
r += n | It& | difference_type m = n; if (m >= 0) while (m--) ++r; else while (m++) --r; return r; | `n` 可为正或负 复杂度为常数（即实现不能按操作语义所示实际执行循环）
a + n n + a | It | It temp = a; return temp += n; | `n` 可为正或负 a + n == n + a
r -= n | It& | return r += -n; | `n` 的绝对值必须在 `difference_type` 的可表示值范围内。
i - n | It | It temp = i; return temp -= n; |
b - a | `difference_type` | return n; | 前条件： 存在 `difference_type` 类型的值 `n` 满足 a+n==b 后条件： b == a + (b - a)
i[n] | 可转换到 `reference` | *(i + n) |
a < b | 可按语境转换到 bool | 等价于 return b - a > 0; | 前条件： 同 b - a 严格全序关系： `!(a < a)` 若 `a < b` 则 `!(b < a)` 若 `a < b` 且 `b < c` 则 `a < c` `a < b` 或 `b < a` 或 `a == b` （表达式恰有一者为 true）
a > b | 可按语境转换到 bool | b < a | 与 a < b 相反的全序关系
a >= b | 可按语境转换到 bool | !(a < b) |
a <= b | 可按语境转换到 bool | !(a > b) |

上述规则隐含了老式随机访问迭代器 (LegacyRandomAccessIterator) 亦实现可小于比较 (LessThanComparable) 。

可变（mutable）老式随机访问迭代器 (LegacyRandomAccessIterator) 是还额外满足老式输出迭代器 (LegacyOutputIterator) 要求的老式随机访问迭代器 (LegacyRandomAccessIterator) 。

### 概念 为了定义 std::iterator_traits，定义了以下仅用于阐释的概念：
template<class I> concept __LegacyRandomAccessIterator = __LegacyBidirectionalIterator<I> && std::totally_ordered<I> && requires(I i, typename std::incrementable_traits<I>::difference_type n) { { i += n } -> std::same_as<I&>; { i -= n } -> std::same_as<I&>; { i + n } -> std::same_as<I>; { n + i } -> std::same_as<I>; { i - n } -> std::same_as<I>; { i - i } -> std::same_as<decltype(n)>; { i[n] } -> std::convertible_to<std::iter_reference_t<I>>; }; |  |
其中仅用于阐释的概念 `__LegacyBidirectionalIterator` 描述于 LegacyBidirectionalIterator#概念。 | (C++20 起)

### 参阅

random_access_iterator (C++20) | 指定 `bidirectional_iterator` 为随机访问迭代器，支持常数时间内的前进和下标访问 (概念)
迭代器库 | 提供迭代器的定义、迭代器表征、适配器及工具函数