A Range is a <spanclass="bold"><strong><spanclass="emphasis"><em>concept</em></span></strong></span>
similar to the STL <ahref="http://www.sgi.com/Technology/STL/Container.html"target="_top">Container</a>
concept. A Range provides iterators for accessing a half-open range <codeclass="computeroutput"><spanclass="special">[</span><spanclass="identifier">first</span><spanclass="special">,</span><spanclass="identifier">one_past_last</span><spanclass="special">)</span></code> of elements and provides information about
the number of elements in the Range. However, a Range has fewer requirements
than a Container.
</p>
<p>
The motivation for the Range concept is that there are many useful Container-like
types that do not meet the full requirements of Container, and many algorithms
that can be written with this reduced set of requirements. In particular,
Because of the second requirement, a Range object must be passed by (const
or non-const) reference in generic code.
</p>
<p>
The operations that can be performed on a Range is dependent on the <ahref="../../../../iterator/doc/new-iter-concepts.html#iterator-traversal-concepts-lib-iterator-traversal"target="_top">traversal
category</a> of the underlying iterator type. Therefore the range concepts
are named to reflect which traversal category its iterators support. See
also terminology and style guidelines. for more information about naming
of ranges.
</p>
<p>
The concepts described below specifies associated types as <ahref="../../../../libs/mpl/doc/refmanual/metafunction.html"target="_top">metafunctions</a>
and all functions as free-standing functions to allow for a layer of indirection.