命名空间
变体
操作

C++ 命名需求: LegacyRandomAccessIterator

来自 cppreference.cn
 
 
C++ 命名要求
基本
类型属性
全库范围




Container(容器)
容器元素
迭代器 (Iterator)
LegacyRandomAccessIterator(传统随机访问迭代器)
流 I/O
格式化器
(C++20)
随机数
并发
(C++11)
Ranges
多维视图
其他

 

一个 LegacyRandomAccessIterator 是一个 LegacyBidirectionalIterator,它可以在常数时间内移动以指向任何元素。

如果一个 LegacyRandomAccessIterator it 源自一个 Container,那么 itvalue_type 与容器的相同,因此解引用 (*it) 得到容器的 value_type

指向数组元素的指针满足 LegacyRandomAccessIterator 的所有要求。

目录

[编辑] 要求

如果类型 It 满足 LegacyRandomAccessIterator

并且,给定

  • 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,类型为 Itconst 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 可以是正数也可以是负数
  • 复杂度为常数 (即,实现不能实际执行操作语义中所示的 while 循环)
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

满足 BooleanTestable

(C++20 前)

模型 boolean-testable

(C++20 起)
等价于 return b - a > 0; 前置条件
  • b - a 相同

严格全序关系

  • !(a < a)
  • 如果 a < b!(b < a)
  • 如果 a < bb < ca < c
  • a < bb < aa == b
    (恰好一个表达式为真)
a > b

满足 BooleanTestable

(C++20 前)

模型 boolean-testable

(C++20 起)
b < a a < b 相反的全序关系
a >= b

满足 BooleanTestable

(C++20 前)

模型 boolean-testable

(C++20 起)
!(a < b)
a <= b

满足 BooleanTestable

(C++20 前)

模型 boolean-testable

(C++20 起)
!(a > b)

上述规则暗示 LegacyRandomAccessIterator 也实现了 LessThanComparable

一个 _可变_ LegacyRandomAccessIterator 是一个 LegacyRandomAccessIterator,它额外满足 LegacyOutputIterator 的要求。

概念

对于 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
LWG 2114
(P2167R3)
C++98 可转换为 bool 对于反映实现的期望来说太弱了 要求已加强
  1. LWG issue 299 在此决议后重新开放。

[编辑] 另见

指定一个 bidirectional_iterator 是一个随机访问迭代器,支持常数时间步进和下标操作
(概念) [编辑]
迭代器库 为迭代器、迭代器特性、适配器和实用函数提供定义