450_____ __ __________Часть III. Современное программирование на C++

if (s == sAssoc.Value) :

// истинно в данных условиях

cout « "This is true." « endl;

В случае, когда ключ или значение являются косвенными объектами, возвращаемое значение будет указателем:

STUDENT *sp;

sp = new STUDENT("SamJohnson", 3.4);

STUDENT_KEY skey(sp->GetId());

STUDENT_DIASSOC spAssoc(skey, sp) ;. // Заметим, что значение передается как указатель if (*sp == *spAssoc.Value())

cout « "This is true" « endl;

Ассоциации также определяют операцию == с помощью такой же операции == типа Key. Поэтому данные типа Key для предыдущего примера STUDENTJCEY должны иметь корректно определенную семантику сравнения.

*

Как уже отмечалось выше, словари-контейнеры реализуются с помощью ассоциаций-контейнеров. За исключением этого ограничения, словари очень похожи на множества и мультимножества. Для определенного ранее типа STUDENT_DDASSOC обычные классы-словари определяются так:

typedef TDictionaryAsHashTable<STUDENT_DDASSOC> STUDENT_DICT1;

//прямой контейнер typedef TIDictionaryAsHashTable<STUDENT_DDASSOC> STUDENTJ3ICT2;

// косвенный контейнер

Конструкторы словарей принимают необязательный параметр, определяющий размер контейнера. По умолчанию используется размер, равный DEFAULT_HASH_TABLE_SIZE, определяемый в resource.h из каталога \Bc5\Include\Classlib. Для построения контейнера из 100 элементов служит оператор:

STUDENT_DICT2 studentDict(100) ;

Для добавления элементов используется функция-член Add, а для удаления — Detach:

StudentDict.Add(spAssoc) ;

//Добавляем определенный выше объект-ассоциацию STUDENTJ3IASSOC *sp2 = studentDict.Detach(sp);

//Возвращается параметр-указатель

Поскольку контейнер косвенный, объекты передаются как указатели и возвращаемые значения являются также указателями на объекты-ассоциации.

ФУНКЦИИ Flush, ForEach И Get-ItemsInContainer ведут себя так Же, как И В

случае других контейнеров. (См. раздел "Массивы").