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 ведут себя так Же, как И В
случае других контейнеров. (См. раздел "Массивы").