Understanding Range Concepts and Views
Explore the range adaptors and constrained algorithms of the ranges library in this lesson.
The term “range” refers to an abstraction that defines a sequence of elements bounded by start and end iterators. A range, therefore, represents an iterable sequence of elements. However, such a sequence can be defined in several ways:
With a begin iterator and an end sentinel. Such a sequence is iterated from the beginning to the end. A sentinel is an object that indicates the end of the sequence. It can have the same type as the iterator type, or it can be of a different type.
With a start object and a size (number of elements), representing a counted sequence. Such a sequence is iterated
times (where represents the size) from the start. With a start and a predicate, representing a conditionally terminated sequence. Such a sequence is iterated from the start until the predicate returns false.
With only a start value, representing an unbounded sequence. Such a sequence can be iterated indefinitely.
Range concepts in the <ranges>
header
All these kinds of iterable sequences are considered ranges. Because a range is an abstraction, the C++20 library defines a series of concepts to describe requirements for range types. These are available in the <ranges>
header and the std::ranges
namespace. The following table presents the list of range concepts:
Get hands-on with 1400+ tech skills courses.