Итератор (ранее: векторные часы)

Задача состоит в реализации класса, объекты которого позволяют последовательно просматривать элементы некоторого набора других объектов. Сначала рассмотрим эту задачу в абстрактной форме.

Пусть есть контейнер каких-то объектов. Тип объектов и способ их хранения в контейнере не имеют принципиального значения. В нашем случае это будет массив целых чисел. То есть объектами являются целые числа, а способ хранения набора — массив фиксированной длины. Итератором по контейнеру является объект, который содержит в себе информацию о контейнере (с которым этот итератор связан) и своей текущей позиции внутри набора. С одним контейнером может быть одновременно связано несколько итераторов, которые могут "находиться" на разных элементах.

Таким образом есть два класса: контейнер чего-то и итератор по этому контейнеру. Контейнер предоставляет общий интерфейс работы с набором объектв: создание контейнера, добавление и удаление элементов, поиск элеента по значению, уничтожение контенера и т.п. Способ хранения элементов от пользователя скрыт. Класс итератор реализует следующий интерфейс (набор функций):

Класс итератор является другом (friend) контейнера и ему известен способ хранения элементов контейнера. Состояние итератора включает переменные, описывающие текущую позицию итератора. Если у нас есть два типа контейнеров, например, массив целых чисел и список матриц, то должно быть и два типа итераторов. Первый — для обхода массива, второй — для обхода списка матриц. Состоянием первого итератора может быть значение индекса массива, второго — указатель на элемент списка.

Конкретная задача

Требуется реализовать два класса: контейнер целых чисел на основе массива фиксированной длины, и итератор для этого контейнера.

Интерфейс контейнера:

Для этого класса можно не реализовывать конструкторы копирования, оператор присваивания и т.п.

Интерфейс итератора:

Подсказка-рекомендация: состояние итератора может включать указатель на объект-контейнер (с каким конкретно набором целлых чисел этот итератор связан) и значение индекса массива (массив — приватная переменая контейнера, значение индекса — текущая позиция в контейнере).

В случае обнаружения ошибочных данных методы, вкючая конструкторы, должны генерировать исключения.

Решение должно содержать набор тестов, которые вы разрабатываете самостоятельно.