Главная arrow С++ (часть 3) arrow Применение итераторов

Применение итераторов

индексирование массива — очень удобный способ циклической обработки массива, размещенного в динамической памяти, но не единственный имеющийся в вашем распоряжении. Во многих приложениях лучше воспользоваться итератором, потому что он избавляет от возможного выхода за границы массива. Напоминаю, что для класса GCPtr итераторами служат объекты типа iter. Класс iter поддерживает все операции с указателями, например, такие как ++. Он также предоставляет возможность индексирования итератора как массива.
В листинге 2.6 приведен вариант программы листинга 2.5 с применением итератора. Учтите, легче всего получить итератор для объекта типа GCPtr с помощью синонима GCiterator, описанного спецификатором typedef внутри класса GCPtr и автоматически связываемого с базовым типом т.
р^гинг 2.6. Демонстрация применения итератора J
¦include <iostream> ¦include <new> ¦include "gc.h"
using namespace std;
int mainO {
try {
// Создает объект GCPtr для динамически размещенного массива из // 10 элементов типа int. GCPtr<int, 10> ар = new int[10];
// Объявляет итератор типа int. GCPtr<int>::GCiterator itr;
// Присваивает itr указатель на начало массива, itr = ар.begin();
// Используя индексирование массива, присваивает его элементам // некоторые значения. for(unsigned i=0; i < itr.sizeO; i++) itr[i] = i;
// Перемещается внутри массива с помощью итератора. for(itr = ap.beginO; itr != ap.endO; itr++) cout « *itr « " ";
cout « endl;
} catch(bad_alloc exc) {
cout « "Allocation failure!\n";
return 1; } catch(OutOfRangeExc exc) {
cout « "Out of range access!\n";
return 1;
}
return 0;
}
Попробуйте увеличить итератор настолько, чтобы он указывал за границу размещенного массива. Затем попытайтесь получить доступ к значению элемента, находящегося за границей массива. Вы увидите, что будет генерироваться исключение типа OutOfRangeExc. Обычно изменять итератор можно любым предпочитаемым вами способом, не вызывая генерации исключения. Однако если он вдруг укажет на память вне границ базового массива, и вы попытаетесь получить или задать значение этого элемента, возникнет ошибка выхода за границы.