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

int operator==(const STUDENT &rhs) const

( return (id == rhs.id); } int operator<(const STUDENT &rhs) const // Sort students by ID.

( return (id < rhs.id); } int CompareGrade(const STUDENT &rhs) const

{ return (grade < rhs.grade); }

// Определим простой вывод.

friend ostream& operator«(ostream &os, const STUDENT &s) {

os « setiosflags(ios::fixed I ios::left) « setprecision(l) « " " « setw(17) •« s.GetIdO « " " « s.GetGrade() « endl;

return os;

>

>;

#endif

«

Теперь на основе нового класса STUDENT продемонстрируем использование объектов множество и мультимножество.

h04631.jpg

#define RWSTD_NO_NAMESPACE ttinclude <iostream.h>

#include <set.h> ^include "student3.h"

// Это множество упорядочено посредством применения операции < //к идентификатору студента, то есть в лексикографическом // порядке имен студентов typedef set<STUDENT, less<STUDENT> > STUDENT_SET;

// Определим класс, который строится на основе функции // сравнения рейтингов студентов struct GRADE_COMPARE (

bool operator()(const STUDENT &sl, const STUDENT &s2) const f

return sl.GetGrade() < s2.GetGrade();

) );

// Здесь определяется тип множества так, чтобы использовать

// рейтинги для упорядочивания.

// Студенты могут иметь одинаковые рейтинги, поэтому используется

// мультимножество — оно допускает одинаковые ключи.

typedef multiset<STUDENT, GRADE_COMPARE> STUDENT_SET2;