just saying..maybe call the iterators "begin" and "end", or at least don't call the second one "last" when it is not the last, even if it's explained that it is not the last to erase. end, wall, stop, onebehindlast or anything like that.
Koenig and Moo (C++ Report, Ruminations on C++) call them 'start' and 'beyond'.
The IS consistently uses the terms 'first' and 'last'. Programmers quickly get used to the idea that 'last', as normally used in C++, is really one beyond the actual last element, and avoid writing stuff like:
1 2 3 4 5 6
if( !vec.empty() )
{
auto first = vec.begin() ; // iterator to the first item
auto last = vec.end() - 1 ; // iterator to the actual last element
// ...
}