Ranges are an abstraction of containers that allow a C++ program to operate on elements of data structures uniformly. It their simplest form, a range object is one on which one can call begin and end to get an iterator ([iterators.iterator]) and a sentinel ([iterators.sentinel]). To be able to construct template algorithms and range adaptors that work correctly and efficiently on different types of sequences, the library formalizes not just the interfaces but also the semantics and complexity assumptions of ranges.

This document defines three fundamental categories of ranges
based on the syntax and semantics supported by each: *range*,
*sized range* and *view*, as shown in
Table [tab:ranges.relations].

The Range concept requires only that begin and end return an iterator and a sentinel. The SizedRange concept refines Range with the requirement that the number of elements in the range can be determined in constant time using the size function. The View concept specifies requirements on a Range type with constant-time copy and assign operations.

In addition to the three fundamental range categories, this document defines
a number of convenience refinements of Range that group together requirements
that appear often in the concepts and algorithms.
*Bounded ranges* are ranges for which begin and end return objects of the
same type. *Random access ranges* are ranges for which
begin returns a type that satisfies
RandomAccessIterator ([iterators.random.access]). The range
categories *bidirectional ranges*,
*forward ranges*,
*input ranges*, and
*output ranges* are defined similarly.