Why is it that in the STL it is standard to indicate a sequence of elements in a container by a begin iterator that points to the first element and an end iterator that points to one past the last element?
Andrew Koenig has quite a good derivation of iterators that appeared initially in The C++ Report but has been repreinted in his book Ruminations on C++ (or somthing like that).
You can read it there, but the idea of an iterator is to provide a data structure allow that allows you to traverse another data structure with as little knowledge of that data structure as possible. It just so happens that it's easier to check for one past the end of the container than it identify the actual end.
For example, if you're reading a file, it's easy to tell if you've gone off the end because you hit EOF, but it's hard to know where the actual end is. There's simply no way to do that using sequential access only. You either need to use the file metadata (e.g stat) or direct access (seek/tell/seek).