Мы добавили в наш вектор оператор обращения к элементу по индексу. Но что это за вектор, если по нему нельзя пробежаться циклом for? Давайте попробуем пробежаться циклом for по нашему вектору. Пишем for (int x: sv). У нас вектор sv, вывести x. Компилируем. Не компелируется. Потому что компилятор нам говорит begin и end не объявлены в данной области видимости. Как мы с вами уже знаем, чтобы тип можно было использовать в цикле for, у него должны быть методы begin и end. Давайте их добавим. Добавим метод begin и метод end. Вот только вопрос - а что эти методы должны возвращать? Какой тип они должны возвращать, чтобы мы могли применять наш вектор в цикле for. Давайте посмотрим, во что цикл for разворачивается, мы это с вами уже изучали в блоке про шаблоны классов. Цикл for, который называется range base for разворачивается вот в такой цикл. На самом деле, если быть совсем правильным, то там чуть-чуть по-другому, но для наших нужд хватит вот такого представления цикла for. Значит, запускается цикл. Есть переменная i, ей присваивается результат вызова метода begin. Затем эта переменная сравнивается с конечным мотератором, с результатом вызова метода end, и на каждую терацию цикла она увеличивается на единицу. Смотрите, какие требования предъявляются к тем объектам, которые возвращаются из метода в begin end. Метод begin должен указывать на первый элемент. Потому что мы присваиваем результат вызова begin в переменную i и к этой переменной сразу же обращаемся в теле цикла. Метод end должен указывать за последний элемент вектора. Потому что так устроены итераторы, такова концепция полуинтервалов, которая применяется в стандартной библиотеке C++. Ещё одно требование, это то, что увеличение итератора того, что возвращает метод begin на единицу, должно приводить к перемещению его на следующий элемент. И если внимательно подумать, то всем этим требованиям удовлетворяют указатели на элементы нашего вектора. То есть, в качестве begin можно использовать указатель на первый элемент нашего вектора. В качестве end можно использовать указатель на элемент за последним. То есть, мы берем указатель на первый элемент - наше поле дата - прибавляет к нему размер вектора, и это будет наш end, наш указатель за последний элемент. Ну и наконец, при увеличении указателя на единицу, мы с вами только что изучили арифметику указателей, мы смещаемся к следующему элементу. Поэтому мы в качестве типа возвращаемого значения можем указать Т*. Указатель на элемент типа T. Давайте реализуем эти методы. Давайте рядом с полем дата заведем еще одно поле end_. Подчеркивание, чтобы оно не пересекалось с именем метода. И в конструкторе проинициализируем end как data + size. Тогда метод begin будет возвращать data. А метод end поле end_. Для начала давайте проверим, что теперь цикл for с нашим вектором sv компелируется. Компелируется. Отлично. Теперь давайте проинициализируем наш вектор, элементы нашего вектора, какими-нибудь значениями, sv [0] = 5, sv [1] = 3, sv [2] = 4, sv [3] =-1. Давайте проверим, что у нас все компилируется и работает. Отлично. Наш цикл for с вектором v действительно отработал и вывел те элементы, которые мы в него записали. Более того, мы, добавив наш вектор методы begin и end, мы дали нашему вектору итераторы, и значит мы можем его использовать в алгоритмах. Например, мы можем взять наш вектор sv и отсортировать его. Это скомпилируется, сработает и мы получим отсортированный вектор. Таким образом мы с вами узнали, что указатели на элементы вектора можно использовать в качестве его итераторов.