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

来自cppreference.com
< cpp‎ | named req
 
 
C++ 具名要求
基础
类型属性
库所属
容器
容器元素
(C++11)

迭代器
流 I/O
格式化
(C++20)
随机数
(C++11)    
并发
(C++11)
(C++11)
范围
其他
(C++11)


 

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

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

要求

类型 It 满足老式随机访问迭代器 (LegacyRandomAccessIterator) ,如果

且给定

  • value_typestd::iterator_traits<It>::value_type 所指代的类型
  • difference_typestd::iterator_traits<It>::difference_type 所指代的类型
  • referencestd::iterator_traits<It>::reference 所指代的类型
  • iabItconst It 类型的对象
  • rIt& 类型的值
  • ndifference_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 < bb < c,那么a < c
  • a < bb < aa == 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>>;

        };

其中仅用于阐释的概念 __LegacyBidirectionalIteratorLegacyBidirectionalIterator#概念描述。

(C++20 起)

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 299
(N3066)
C++98 a[n] 的返回类型需要可转换到 const value_type& 返回类型需要可转换到 reference
LWG 448 C++98 a[n] 的返回类型需要可转换到 value_type 返回类型需要可转换到 const value_type&[1]
LWG 1079 C++98 b - a 的定义用到了 a < b,导致循环定义 从定义中移除 a < b
  1. 此问题解决后,LWG 问题 299 重新打开了。

参阅

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