Reverse Arbitrary Access Iterator

Category: iterators
Component type: concept

Description

A Reverse Arbitrary Access Iterator is an iterator that provides both increment and decrement (just like a Bidirectional Iterator), and that also provides constant-time methods for moving backward in arbitrary-sized steps.

Refinement of

Bidirectional Iterator, LessThan Comparable

Associated types

The same as for Bidirectional Iterator

Notation

X A type that is a model of Reverse Arbitrary Access Iterator
T The value type of X
Distance The distance type of X
i, j Object of type X
t Object of type T
n Object of type Distance

Definitions

Valid expressions

In addition to the expressions defined in Bidirectional Iterator, the following expressions must be valid.

Name Expression Type requirements Return type
Iterator subtraction i -= n   X&
Iterator subtraction i - n   X
Difference i - j   Distance

Expression semantics

Semantics of an expression is defined only where it differs from, or is not defined in, Bidirectional Iterator or LessThan Comparable.

Name Expression Precondition Semantics Postcondition
Iterator subtraction i -= n Including i itself, there must be n dereferenceable or past-the-end iterators preceding or following i, depending on whether n is positive or negative. (n <= 0).

i is dereferenceable or past-the-end.
Iterator subtraction i - n Same as for i -= n Equivalent to { X tmp = i; return tmp -= n; }. Result is dereferenceable or past-the-end
Difference i - j Either i is reachable from j or j is reachable from i, or both. Returns a number n such that i == j + n  
Less i < j Either i is reachable from j or j is reachable from i, or both. [1] As described in LessThan Comparable [2]  

Complexity guarantees

All operations on Reverse Arbitrary Access Iterators are amortized constant time. [3]

Invariants

Symmetry of addition and subtraction If i + n is well-defined, then i += n; i -= n; and (i + n) - n are null operations. Similarly, if i - n is well-defined, then i -= n; i += n; and (i - n) + n are null operations.
Relation between distance and addition If i - j is well-defined, then i == j + (i - j).
Reachability and distance If i is reachable from j, then i - j >= 0.
Ordering operator < is a strict weak ordering, as defined in LessThan Comparable.

Models

Notes

[1] The precondition defined in LessThan Comparable is that i and j be in the domain of operator <. Essentially, then, this is a definition of that domain: it is the set of pairs of iterators such that one iterator is reachable from the other.

[2] All of the other comparison operators have the same domain and are defined in terms of operator <, so they have exactly the same semantics as described in LessThan Comparable.

[3] This complexity guarantee is in fact the only reason why Reverse Arbitrary Iterator exists as a distinct concept. Every operation in iterator arithmetic can be defined for Bidirectional Iterator; in fact, that is exactly what the algorithms advance and distance do. The distinction is simply that the Bidirectional Iterator implementations are linear time, while Reverse Arbitrary Iterators are required to support random access to elements in amortized logarithmic time. This has major implications for the sorts of algorithms that can sensibly be written using the two types of iterators.

See also

LessThan Comparable, Trivial Iterator, Bidirectional Iterator, Iterator Overview, Sequence, LessThan Comparable, Trivial Iterator, Input Iterator, Output Iterator, Forward Iterator, Bidirectional Iterator, Bidirectional Iterator LOGN, Forward Arbitrary Access Container, Forward Arbitrary Access Iterator Forward Arbitrary Access Container LOGN, Forward Arbitrary Access Iterator LOGN, Reverse Arbitrary Access Container, Reverse Arbitrary Access Container LOGN, Reverse Arbitrary Access Iterator LOGN, Random Access Container, Random Access Iterator, Random Access Container LOGN, Random Access Iterator LOGN, Arbitrary Access Container LOGN, Arbitrary Access Iterator LOGN

 All Classes Files Functions Variables Typedefs