На самом деле .end()
не возвращает итератор в элемент last , скорее он возвращает итератор в past-the-last-element . Итератор до последнего элемента находится прямо перед ним; то есть, если it
указывает на последний элемент, то ++it
заставляет it
указывать на элемент last-the-last.
Спецификация языка называет его итератор конца года
§24.1 / 5 (C ++ 03) читает,
Так же, как обычный указатель на массив гарантирует, что существует значение указателя, указывающее за последним элементом массива, так и для любого типа итератора есть значение итератора, которое указывает за последним элементом соответствующего контейнера. Эти значения называются прошлыми значениями. Значения итератора i, для которых определено выражение * i, называются разыменованными. Библиотека никогда не предполагает, что значения из конца в конец разыменовываются
Также обратите внимание, что разыменование Итератор конца-конца вызывает неопределенное поведение:
auto it = students.end(); //ok
it->someFunction(); //undefined behavior
(*it).someFunction(); //undefined behavior