Any one could explain me what is the meaning of past-the-end
. Why we call end()
function past-the-end?
Because it doesn't point to the last element of a container, but to somewhere past the last element of a container.
If you dereference end()
it results in undefined behaviour.
Adding another point to the above correct answers. This was also done to be compatible with arrays. For example in the code below:
char arr[5];
strcpy(arr, "eakgl");
sort(&arr[0], &arr[5]);
This will work fine.
Instead if you had given :
sort(&arr[0], &arr[4]);
it would miss sorting the last character.
This also helps to represent empty containers naturally.
The functions begin()
and end()
define a half open range([begin, end)
), which means:
The range includes first element but excludes the last element. Hence, the name past the end.
The advantage of an half open range is:
It avoids special handling for empty ranges. For empty ranges, begin()
is equal to
end()
.
It makes the end criterion simple for loops that iterate over the elements: The loops simply
continue as long as end()
is not reached
Like interval in mathematics, stl uses [begin, end)
.
That's why we could write for (auto it = v.begin(); it != v.end(); ++it)
Literally, because it points one past the end of the array.
It is used because that element is empty, and can be iterated to, but not dereferenced.
int arry[] = {1, 2, 3, 4, /* end */ };
^^^^^^^
std::end(arry) would point here.