Почнемо обговорення з класу person, в якому містяться прізвища, імена та телефони людей. Ми створюватимемо компонети цього класу і вставлятимемо їх у множину, заповнюючи тим самим віртуальну телефонну книжку. Користувач взаємодіє з програмою, вводячи ім’я людини. На екран виводиться результат пошуку даних, що відповідає вказаному імені. Використаємо для розв’язку цієї задачі мультимножину, щоб два і більше об’єкти person могли мати одинакові імена.
#include<iostream>
#include<conio>
#include<set>
#include<string>
using namespace std;
class person{
private:
string lastName;
string firstName;
long phoneNumber;
public:
person():lastName("__"),firstName("__"),phoneNumber(0)
{ }
person(string lana,string fina,long pho):
lastName(lana),firstName(fina),phoneNumber(pho)
{ }
friend bool operator<(const person&,const person&);
friend bool operator==(const person&,const person&);
void display() const
{cout<<endl<<lastName<<" "<<firstName<<" "<<phoneNumber;
}
};
bool operator<(const person& p1, const person& p2)
{if (p1.lastName==p2.lastName)
return (p1.firstName<p2.firstName?true:false);
else
return (p1.lastName<p2.lastName?true:false);
};
bool operator==(const person& p1, const person& p2)
{return(p1.lastName==p2.lastName &&
p1.firstName==p2.firstName? true:false);
};
////////////
int main()
{ person pers1("Bonnie","Essa",323456);
person pers2("Billi","Emma",323457);
person pers3("Mappy","Etta",323450);
person pers4("Asta","Esta",323451);
person pers5("Catti","Enna",3234551);
person pers6("Lucy","Ecca",323458);
person pers7("Unny","Ewwa",323453);
person pers8("Rony","Erra",323459);
multiset<person, less<person> >persSet; //мультимножина класу person
multiset<person, less<person> >::iterator iter;
persSet.insert(pers1); //занести обєкти person в мультимножину
persSet.insert(pers2);
persSet.insert(pers3);
persSet.insert(pers4);
persSet.insert(pers5);
persSet.insert(pers6);
persSet.insert(pers7);
persSet.insert(pers8);
cout<<"\nChyslo zapysiv: "<<persSet.size();
iter=persSet.begin();
while(iter!=persSet.end())
(*iter++).display();
string searchLastName,searchFirstName;
cout<<"\n\nVvedit prizvywe ";
cin>>searchLastName;
cout<<"\n\nVvedit imiae ";
cin>>searchFirstName;
//створення обєкту з заданими значеннями атрибутів
person searchPerson(searchLastName,searchFirstName,0);
//порахувати к-сть людей з таким іменем
int cntPersons=persSet.count(searchPerson);
cout<<"4yslo ludej z imenem "<<cntPersons;
//вивести всі запити, що відповідають запиту
iter=persSet.lower_bound(searchPerson);
while(iter!=persSet.upper_bound(searchPerson))
(*iter++).display();
cout<<endl;
getch();
return 0;
}
Програма 15.31
Для роботи з контейнерами STL класу person потрібно кілька загальних методів. Вони являють собою конструктори без аргументів та з аргументами, перезавантажені операції < i ==. Всі ці методи використовуються списковим класом та різними алгоритмами. В інших операціях можуть знадобитися якісь інші специфічні методи, наприклад, перезавантажена операція присвоєння, конструктор копіювання і деструктор.
Перезавантажені операції < i == повинні мати констатні параметри. Загалом краще їх зробити дружніми, але і у вигляді звичайних методів вони повністю підходять для роботи.
Перезавантажена операція < задає порядок сортування елементів множини. В нас вона визначена таким чином, щоб сортувалися прізвища, а у випадку їх співпадіння – ще й імена.
Щойно визначивши клас, ми дістали можливість роботи контейнера з ним тими ж способами, що й зі звичайними змінними базових типів.
Оскільки ми маємо справу з мультимножиною, методи lower_bound() та upper_bound() дають можливість виводити всі елементи, що входять у заданий діапазон. В нашому прикладі верхня границя співпадає з нижньою, тому просто виводяться всі записи, що містять дані про людей із заданим іменем. звернімо увагу, що ми створюємо фіктивний запис з даними про людину чи кількох людей з тими ж іменами, які користувач вказав у запиті
person searchPerson(searchLastName,searchFirstName,0);
При цьому значення функцій lower_bound() і upper_bound() повинні відповідати саме вказаним значенням.