Вы рассматриваете итераторы как указатели.
Итераторы могут использовать указатели в качестве подробностей реализации, но они не являются фактическими указателями.
Таким образом:
iter = vec.end() + 1; // This is not valid.
Тамнет такой вещи, как два элемента передают конец данных.
vec.end () возвращает итератор, который, когда декремент является ссылкой на последние элементы (при условии, что есть элементы).Хотя итератор, ссылающийся на последний элемент при увеличении, эквивалентен итератору, возвращаемому функцией end ().
// Note: Assuming vector iterators were not invalidated after an insert anyway.
// But for arguments sake lets play this out.
//
vector<int>::iterator iter = vec.end(); // points 1 past vec[9]
vec.push_back( 777 );
bool is_this_valid_and_true = *iter == vec[10]; // Not valid.
// This is the end() iterator
// de-referencing it is UB
Но отмена ссылки на итератор, представленный функцией end (), является неопределенным поведением () (даже если у вас естьзарезервированное пространство) (реализация может не использовать указатели. Например, некоторые реализации DeBug STL будут выполнять расширенную проверку ошибок в коде итератора).