Особенности работы методов begin и end
Как реализованы методы begin и end? Они просто возвращают указатели на нужные элементы, или внутри скрывается нечто сложнее?
Ответы (1 шт):
Очевидно, что для std::list итератор не может быть просто указателем, (хотя и может быть реализован как класс, содержащий единственный указатель).
Далее, ограничимся рассмотрением только std::vector:
Если рассматривать с точки зрения производительности (ассемблерного кода в releas версии кода), то можно считать что это просто возврат указателя.
Если рассматривать с точки зрения стандарта и семантики, то тип данных std::vector::iterator, имеет право не быть указателем. Более того, он не является указателем, в большинстве современных реализаций stl.
Специальный тип данных, (имеющий больший размер, чем указатель), потребовался для того, чтобы отлавливать некоторые типы типичных ошибок, которые было-бы невозможно перехватить иначе. Например, разыменовывавшие итератора, после того как контейнер к которому он относился был уничтожен или сравнение итераторов, относящихся к разным контейнерам... (Это все включается только в debug моде компиляции или по специальной опции компилятора.)