На что конкретно указывает итератор end() в std::list? C++
Итератор end(), если верить документации, указывает на место после последнего элемента в контейнере. То есть на участок памяти ПОСЛЕ последнего элемента контейнера. Если с такими структурами как вектор, где память расположена последовательно, это легко представить, то на что указывает end() в списках, где элементы могут быть разбросаны по памяти?
Ответы (1 шт):
Итераторы, содержащие значение past-the-end не могут быть разыменованы (для них нельзя вызывать operator*), поэтому говорить о том, что они вообще указывают на какое-то место в памяти некорректно.
Если же глянуть на конкретную реализацию, например, MS, то можно увидеть следующее:
_NODISCARD iterator begin() noexcept {
return iterator(_Mypair._Myval2._Myhead->_Next, _STD addressof(_Mypair._Myval2));
}
_NODISCARD iterator end() noexcept {
return iterator(_Mypair._Myval2._Myhead, _STD addressof(_Mypair._Myval2));
}
Т.е. первый элемент ассоциирован с неким head->next, а past-the-end с head.
Также стоит заметить, что для пустого контейнера должно выполняться условие begin() == end(). А значит head->next == head. Т.о. в кокретной реализации std::list::end() указывает на некоторую "голову" списка, при этом сама "голова" является не элементом списка, а неким внутренним специальным значением.