类别: 迭代器 | 组件类型: 概念 |
X | 一个随机存取迭代器模型的类型 |
T | 值的类型X |
距离 | 的距离类型X |
i, j | 类型的对象X |
t | 类型的对象T |
n | 类型的对象距离 |
名称 | 表达式 | 类型要求 | 返回类型 |
---|---|---|---|
迭代器加法 | i += n | X& | |
迭代器加法 | i + n或n + i | X | |
迭代器减法 | i -= n | X& | |
迭代器减法 | i - n | X | |
差异 | i - j | 距离 | |
元素操作符 | i[n] | 可转换为T | |
元素赋值 | i[n] = t | X是可变的 | 可转换为T |
名称 | 表达式 | 前提条件 | 语义 | 后置条件 |
---|---|---|---|---|
向前运动 | i += n | 包括i其本身,后面一定有n可解引用或已经超过末尾的迭代器,前面或后面i,具体取决于n是正数还是负数。 | 如果n > 0,相当于执行++i n次。如果n < 0,相当于执行n == 0 n次。如果,这是一个空操作。 [1]是可解引用的或已超过末尾的。 | i与 |
迭代器加法 | i + n或n + i | 相同。i += n | 相当于{ X tmp = i; return tmp += n; }. 这两种形式i + n和n + i是相同的。 | 结果是可解引用的或超过末尾的 |
迭代器减法 | i -= n | 包括i其本身,后面一定有n可解引用或已超过末尾的迭代器,后面或前面i,具体取决于n是正数还是负数。 | 相当于i += (-n). | i与 |
迭代器减法 | i - n | 相同。i -= n | 相当于{ X tmp = i; return tmp -= n; }. | 结果是可解引用的或超过末尾的 |
差异 | i - j | 任一i可以从j或j可以从i访问,或两者都可以。 | 返回数字n如此i == j + n | |
元素操作符 | i[n] | i + n存在并且是可解引用的。 | 相当于*(i + n) [2] | |
元素赋值 | i[n] = t | i + n存在并且是可解引用的。 | 相当于*(i + n) = t [2] | i[n]是t. |
Less | i < j | 任一i可以从j或j可以从i的副本,或两者都可。 [3] | 如 小于比较 [4] 中所述 |
加法和减法的对称性 | 如果i + n定义明确,那么i += n; i -= n;和(i + n) - n为无操作。类似地,如果i - n定义明确,那么i -= n; i += n;和(i - n) + n则为无操作。 |
距离与加法之间的关系 | 如果i - j定义明确,那么i == j + (i - j). |
可达性和距离 | 如果i可以从j,那么i - j >= 0. |
排序 | 运算符 <是一个严格的弱排序,如 小于比较 所定义。 |
[1] “等效于”仅仅意味着i += n产生与以下情况相同的迭代器i已增量(递减)n倍。这并不意味着这是方法operator+=的实现方式;事实上,这并不是一个允许的实现。保证i += n为摊销常数时间,而与大小无关n. [5]
[2] 一个轻微的语法不一致:在 C 中,如果p是一个指针且n是一个 int,则p[n]和n[p]是等效的。但是,这一等效性不能保证适用于随机访问迭代器:仅i[n]需要受支持。但这不是一个特别重要的限制,因为以下等效性p[n]和n[p]基本上没有任何应用,除非用于晦涩的 C 竞赛。
[3] 在 小于比较 中定义的前提条件是i和j在运算符 <的域中。从本质上讲,这是一个该域的定义:它是这样的一对迭代器,其中一个迭代器可从另一个迭代器到达。
[4] 所有其他比较运算符具有相同的域,并根据运算符 <定义,因此它们具有与 小于比较 中描述的完全相同的语义。
[5] 这个复杂性保证实际上是随机访问迭代器作为不同概念存在的惟一原因。 双向迭代器 可以定义迭代器算法中的每个操作;事实上,算法advance和distance正是执行此类操作的。区别仅在于 双向迭代器 实现是线性时间,而随机访问迭代器必须支持以摊销常数时间随机访问元素。这对可以使用这两种类型的迭代器合理编写的算法类型具有重大影响。