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

class STODENT_KEY

{

public:

STUDENT_KEY() : id("") {)

STUDENT_KEY(const string &id_) : id(id_) {} STUDENT_KEY(const char *id_) : id(id_) {} STUDENT_KEY(const STUDENT_KEY Skey) { *this = key; } ~STUDENT__KEY() ()

STUDENT_KEYS operator=(const STUDENT_KEY &rhs) {

if (this != &rhs) . // Избежать самокопирования. id = rhs.id;

return *this;

}

// Сравнение ДОЛЖНО быть определено

int operator==(const STUDENT KEY &rhs) const { return id == rhs.id; } int operator<(const STUDENT KEY &rhs) const '{ return id < rhs.id; } const strings GetIdO const ( return id; } // требуемая функция:

unsigned HashValueO const { return id.hashO; } private:

string id;

} •' '

Конструкторы ассоциативных классов-шаблонов принимают два параметра:

ключ и связанное с ключом значение. Оба они могут быть как прямыми, так и косвенными. Для объекта STUDENT в качестве значения и объекта STUDENT_KEY в качестве ключа, ассоциативными классами будут:

typedef TDDAssociation<STUDENT_KEY, STUDENT> STUDENT_DDASSOC;

// Ключ прямой, значение прямое typedef TDIAssociation<STUDENT_KEY, STUDENT> STl-jDENT_DIASSOC;

// Ключ прямой, значение косвенное typedef TIDAssociation<STUDENT_KEY, STUDENT> STUDENT_IDASSOC;

// Ключ косвенный, значение прямое typedef TIIAssociation<STUDENT_KEY, STUDENT> STUDENT_IIASSOC;

// Косвенный ключ, косвенное значение

Определение ассоциативной переменной может быть записано как:

STUDENT s("SamJohnson", 3.4);

STUDENTJKEY skey(s.Getid());

STUDENT_DDASSOC sAssocfskey, s) ;

// Оба параметра переданы по значению.

Функция-член HashValue возвращает результат своего объекта-ключа.

Функции-члены Key и value возвращают соответственно ключ и значение объектов. Прямые объекты возвращаются по значению: