A bracket – [ or ] – means that end of the range is inclusive — it includes the element listed. A parenthesis – ( or ) – means that end is exclusive and doesn’t contain the listed element. So for [first1, last1), the range starts with first1 (and includes it), but ends just before last1.
Assuming integers:
(0, 5) = 1, 2, 3, 4
(0, 5] = 1, 2, 3, 4, 5
[0, 5) = 0, 1, 2, 3, 4
[0, 5] = 0, 1, 2, 3, 4, 5
That’s a half-open interval.
A closed interval [a,b] includes the end points.
An open interval (a,b) excludes them.
In your case the end-point at the start of the interval is included, but the end is excluded. So it means the interval “first1 <= x < last1". Half-open intervals are useful in programming because they correspond to the common idiom for looping: for (int i = 0; i < n; ++i) { ... } Here i is in the range [0, n).