Пошук людини із заданим іменем виявляється дуже швидким при роботі з множинами чи мультимножинами. Якщо ж для нас важливий не швидкий пошук, а швидка вставка чи видалення об’єктів типу person, то краще вдатися до списків. Як це зробити, показано в програмі 15.32.
#include<iostream>
#include<conio>
#include<list>
#include<algorithm>
#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&);
friend bool operator!=(const person&,const person&);
friend bool operator>(const person&,const person&);
void display() const
{cout<<endl<<lastName<<"\t "<<firstName<<"\t "<<phoneNumber;
}
long get_phone() const
{return 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);
};
bool operator!=(const person& p1,const person& p2)
{return !(p1==p2);}
bool operator>(const person& p1,const person& p2)
{return !((p1<p2)&&(p1==p2));
}
////////////
int main()
{list <person> perslist;
list <person>::iterator iter1;
perslist.push_back(person("Annie","Mannie",5667888));
perslist.push_back(person("Billie","Sonny",5667889));
perslist.push_back(person("Rymmie","Catty",5667880));
perslist.push_back(person("Annie","Mannie",9667888));
perslist.push_back(person("Holly","Yvette",5667888));
cout<<"\nChyslo zapysiv: "<<perslist.size();
iter1=perslist.begin();//вивід вмісту списку
while(iter1!=perslist.end())
(*iter1++).display();
//знайти інформацію за ключем
string searchLastName,searchFirstName;
cout<<"\nVvedit prizvywe shukanoi liudyny: ";
cin>>searchLastName;
cout<<"\nVvedit imia shukanoi liudyny: ";
cin>>searchFirstName;
//створення персони з таким іменем
person searchPerson(searchLastName,searchFirstName,0);
//пошук по списку першого входження даного значення
iter1=find(perslist.begin(),perslist.end(),searchPerson);
if(iter1!=perslist.end())
{cout<<"Znajdeno ";
do
{(*iter1).display();
++iter1;
iter1=find(iter1,perslist.end(),searchPerson);
} while(iter1!=perslist.end());
}
else
cout<<"Vidsutnij";
//Знайти людину за номером телефону
cout<<"\n\nVvedit N telephonu ";
long snumber;
cin>>snumber;
bool found_one=false;
for(iter1=perslist.begin();iter1!=perslist.end();++iter1)
{if(snumber==(*iter1).get_phone())
{if (!found_one)
{cout<<"Znajdeno ";
found_one=true;
}
(*iter1).display();
}
}
if (!found_one)
cout<<"Vidsutnij:";
cout<<endl;
getch();
return 0;
}
Програма 15.32
Оскільки ми маємо справу не з множиною і не з відображенням, то методами lower_bouna() та upper_bound() ми скористатися не можемо. Замість них ми використовуємо вже знайому нам функцію find.
iter1=find(perslist.begin(),perslist.end(),searchPerson);
Якщо функція повертає значення знайденого елемента, потрібно знову викликати її для здійснення пошуку, починаючи з наступного запису після знайденого. Це дещо ускладнює програму, оскільки доводиться вносити в неї цикл з двома викликами find().
Складніше шукати дані по заданому номеру телефона, оскільки методи цього класу, в тому числі find(), призначені для пошуку первинної інформації. Тому доводиться «вручну» шукати номер телефону, здійснюючи ітерацію по списку і порівнюючи заданий номер телефону з наявним у черговому поточному записі.
{if(snumber==(*iter1).get_phone())
При використанні списків для збереження об’єктів потрібно оголосити чотири оператори порівняння для конкретного класу: ==, !=, < i >. В залежності від того, які алгоритми використовуються в програмі визначають ті чи інші з них, оскільки далеко не завжди потрібні всі оператори відразу. Так, в нашому прикладі ми могли б обмежитися визначенням оператора ==. А коли б в програмі зустрічався алгоритм sort() для списку, була б необхідна перезавантажувана операція <.