Поскольку итераторы объекта RangeArray — это просто указатели на память, заданную переменной arrayptr, реализация функций итератора begin о и endo тривиальна. Обратите внимание — необходимы как константная, так и неконстантная версии функций. // Возвращает итератор, указывающий на первый элемент. iterator begin() { return fcarrayptr[0]; ( ) 11 Возвращает итератор, указывающий на последний элемент. iterator end() { return &arrayptr[upperbound - lowerbound]; ) 11 Возвращает итератор const на первый элемент. const_iterator begin() const { return &arrayptr[0]; ) // Возвращает итератор const на последний элемент. const_iterator end() const { return fcarrayptr[upperbound - lowerbound]; } Разные функции Все последовательные контейнеры должны предоставлять следующие функции: sizeO, max_size(), emptyO, swapO и ciear(). Далее приведен код этих функций. // Возвращает размер контейнера. size_type sizeO const { return end() - begin(); } // Возвращает максимальный размер RangeArray. size_type max_size() { \ return a.max_size(); } // Возвращает true, если контейнер пуст. bool empty() { return sizeO == 0; } // Обменивает значения двух контейнеров. void swap(RangeArray &b) { RangeArray<T> tmp; tmp = *this; ¦this = b; b = tmp; // Удаляет и уничтожает все элементы. void clear() { erase(begin(), end()); } По существу, действие функций интуитивно понятно. Тем не менее функция max_size() заслуживает нескольких слов. Она возвращает количество элементов типа т, содержащихся в самом большом контейнере, который можно создать. Это число получено с помощью вызова функции распределителя памяти max_size(). В класс RangeArray включена также необязательная функция at о, приведенная далее. // Функция at() выполняет проверку выхода за границы. // Возвращает ссылку на заданный элемент. Т &at(int i) { if(i < lowerbound || i >= upperbound) throw out_of_range("Index Out of Range"); return arrayptr[i - lowerbound]; } // Возвращает ссылку const на заданный элемент. const T &at(int i) const { if(i < lowerbound || i >= upperbound) -throw out_of_range("Index Out of Range"); return arrayptr[i - lowerbound]; } Функция at () возвращает ссылку на элемент с заданным значением индекса. Она отличается от перегруженной операции индексирования operator!] О только тем, что выполняет проверку выхода индекса за границы диапазона (range check). Если значение индекса находится за пределами Диапазона, генерируется исключение out_of_range. Это исключение определено в С++ и хранится в заголовочном файле <stdexcept>. } Класс RangeArray также предоставляет функции, не относящиеся к стандарту библиотеки STL, getiowerbound () и ge t upper bound о. Они возвращают значение верхней и нижней границ объекта RangeArray соответственно. Далее приведен код этих функций. // Возвращает границы, int getiowerbound() { return lowerbound; } int getupperboundO { return upperbound; }
|