Глава 18. Классы-контейнеры_________________________________439

Большинство классов-контейнеров имеют функции-члены, позволяющие пользователю получить последовательный доступ к каждому элементу контейнера и применить к нему пользовательскую функцию:

void ForEach(InterFunc, void *args);

Пусть для нашего класса STUDENT значения всех рейтингов требуется увеличить на 0.2. Для решения такой задачи можно использовать стек.

Более современный метод перебора всех объектов контейнера заключается в использовании класса-итератора (iterator class). Каждый контейнер имеет сопутствующий класс, позволяющий пользователю "перебирать" содержимое контейнера. Имена таких классов-итераторов образуются с помощью ключевого слова Iterator:

[Container class name]Iterator

То есть к именам классов в стиле ADT или FDS добавляется суффикс iterator. Листинг 18.6 иллюстрирует использование итератора и функции-члена ForEach.

h04391.jpg

^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);