Глава 18. Классы-контейнеры_________________________________439
Большинство классов-контейнеров имеют функции-члены, позволяющие пользователю получить последовательный доступ к каждому элементу контейнера и применить к нему пользовательскую функцию:
void ForEach(InterFunc, void *args);
Пусть для нашего класса STUDENT значения всех рейтингов требуется увеличить на 0.2. Для решения такой задачи можно использовать стек.
Более современный метод перебора всех объектов контейнера заключается в использовании класса-итератора (iterator class). Каждый контейнер имеет сопутствующий класс, позволяющий пользователю "перебирать" содержимое контейнера. Имена таких классов-итераторов образуются с помощью ключевого слова Iterator:
[Container class name]Iterator
То есть к именам классов в стиле ADT или FDS добавляется суффикс iterator. Листинг 18.6 иллюстрирует использование итератора и функции-члена ForEach.
^include <iostream.h>
#include <iomanip.h>
#include <classlib\stacks.h>
#include "student2.h"
typedef TIStackAsVector<STODENT> STUDENT_CONTAINER;
// Итератор BIDS typedef TIStackAsVeCtorIterator<STUDENT> STUDENT_CONTAINER_ITERATOR;
// Функция, которую нужно применять к каждому элементу с помощью
// функции-члена ForEach
static void ChangeGrade(STUDENT &s, void *arg);
// Выходные значения студентов в контейнере void WriteStudents(STUDENT_CONTAINER&) ;
int main() (
STUDENT_CONTAINER students;
students.Push(new STUDENT("STUDENT I", 1.0));
students.Push(new STUDENT("STUDENT2", 2.0));
students.Push(new STUDENT("STUDENT3", 3.0)); '
students.Push(new STUDENT("STUDENT4", 4.0));
float gradeChange = 0.2;
cout « "До изменения рейтинга:" « epdl;
WriteStudents(students) ;
students.ForEach(ChangeGrade, sgradeChange);