Материалы книги получены с http://www.itlibitum.ru/
Лучшие варианты
Начиная с этого места, я буду говорить об активных итераторах, однако все сказанное в равной мере относится и к пассивным итераторам. Некоторые разновидности итераторов сильно зависят от характеристик коллекции, но другие обладают большей универсальностью. Перечисляю их, не придерживаясь какого-то определенного порядка.
Возврат в исходную точку
Некоторые классы итераторов содержат функцию, которая возвращает итератор к началу перебора. Я называю ее функцией возврата, Rewind(). Такая возможность поддерживается не всеми коллекциями - например, для потока данных из коммуникационного порта это невозможно.
Ограничение диапазона
Если совокупность объектов, представленных в виде коллекции, упорядочена, итератор должен обладать некоторыми средствами для ограничения перебора конкретным диапазоном объектов.
class Collection {
public:
class Iterator {
public:
Iterator(Key* low, Key* high);
// И т.д.
};
// И т.д.
};
В этом фрагменте low и high определяют минимальное и максимальное значение ключа
соответственно. More() и Next() пропускают элементы, не входящие в заданный диапазон со
включением границ. Другие вариации на эту тему - «все элементы больше X», «все элементы меньше
X» и исключение границ (< вместо <=).
Откат
Итераторы также могут поддерживать функцию Previous() для отката на одну позицию, если такая возможность обеспечивается самой коллекцией. Эта функция часто используется вместе с функцией Current(), которая возвращает то, что Next() возвратила при последнем вызове.
Курсоры
Часто бывает очень полезно объединить концепции, описанные в этой главе, и возвращать из Next() не *-указатель, а курсор, который знает, откуда взялся элемент. Благодаря этому пользователь сможет выполнить удаление, замену или вставку до или после текущего объекта. Возможны два варианта реализации: возвращать курсор из функции Next() или включить «курсороподобные» операции в качестве функций класса самого итератора, работающих с последней полученной позицией. Первый вариант требуется взаимодействия итератора с курсором; во втором они объединяются в один класс.
Назад Содержание Далее
|