Особенности работы методов begin и end

Как реализованы методы begin и end? Они просто возвращают указатели на нужные элементы, или внутри скрывается нечто сложнее?


Ответы (1 шт):

Автор решения: Chorkov

Очевидно, что для std::list итератор не может быть просто указателем, (хотя и может быть реализован как класс, содержащий единственный указатель).

Далее, ограничимся рассмотрением только std::vector:

Если рассматривать с точки зрения производительности (ассемблерного кода в releas версии кода), то можно считать что это просто возврат указателя.

Если рассматривать с точки зрения стандарта и семантики, то тип данных std::vector::iterator, имеет право не быть указателем. Более того, он не является указателем, в большинстве современных реализаций stl.

Специальный тип данных, (имеющий больший размер, чем указатель), потребовался для того, чтобы отлавливать некоторые типы типичных ошибок, которые было-бы невозможно перехватить иначе. Например, разыменовывавшие итератора, после того как контейнер к которому он относился был уничтожен или сравнение итераторов, относящихся к разным контейнерам... (Это все включается только в debug моде компиляции или по специальной опции компилятора.)

→ Ссылка