Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Список об’єктів класу person

Поиск

Пошук людини із заданим іменем виявляється дуже швидким при роботі з множинами чи мультимножинами. Якщо ж для нас важливий не швидкий пошук, а швидка вставка чи видалення об’єктів типу 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() для списку, була б необхідна перезавантажувана операція <.

 

Функціональні об’єкти

 Це поняття широко використовується у STL. Одним з найпопулярніших застосувань функціональних об’єктів є передача їх у якості аргументу алгоритмам. Тим самим можна регулювати їх поведінку. Ми вже використовували функціональні об’єкти в програмі 15.6 (функціональний об’єкт greater<>(), використовуваний нля сортування даних у зворотньому порядку).

Функціональний об’єкт – це функція, яка таким способом прибудовується до класу, що виглядає як звичайний об’єкт. Тим не менше, в такому класі не може бути компонентних даних, а є тільки один метод: перезавантажувана операція (). Клас часто роблять шаблонним, щоб можна було працювати з різними типами даних.

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 36; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.139.87.151 (0.007 с.)