begin, begin + step,
begin + 2 * step, `...`, up to and excluding end.
The two-argument overloads have step = 1. If begin < end && step < 0 or begin > end && step > 0 or begin == end, then an empty range is returned. If step == 0 then begin == end is an error.
For built-in types, the range returned is a random access range. For user-defined types that support `++`, the range is an input range.
in operator and contains: iota over an integral/pointer type defines the in operator from the right. val in iota(...) is true when val occurs in the range. When present, it takes step into account - val won't be considered contained if it falls between two consecutive elements of the range. The contains method does the same as in, but from the left-hand side.
Example: