Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Створення власних функціональних об’єктівСодержание книги
Поиск на нашем сайте Якщо жоден з готових напередвизначених функціональних об’єктів нас не влаштовує, можна написати свій власний. В програмі 15.34 розбираються дві ситуації, коли саме цей спосіб виявляється оптимальним. Одна з них включає в себе використання алгоритму sort(), інша – алгоритму for_each(). Групу елементів дуже зручно сортувати, використовуючи відношення, задані оператором < в класі. Але інколи нам доводиться сортувати контейнер, що містить не самі об’єкти, а посилання на них. Зберігання вказівників замість об’єктів – грамотний розв’язок, особливо при зберіганні великих об’ємів інформації. Такий підхід є ефективним за рахунок уникнення копіювання кожного об’єкту при поміщенні його в контейнер. Тим не менше, проблема сортування залишається, оскільки об’єкти будуть впорядковані за адресами вказівників, а не за їх власними атрибутами. Щоб змусити sort() працювати у випадку з контейнером вказівників так, як нам потрібно, необхідно мати окремий функціональний об’єкт, що задає метод сортування. Як це зробити, показано в програмі 15.34. Тут задається вектор вказівників на об’єкти класу person. Об’єкти поміщаються у вектор, потім сортуються звичайним способом, що призводить до впорядкування за адресами вказівників, а не за атрибутами самих об’єктів. Це зовсім не те, що нам потрібно, крім того, сортування взагалі не справляє жодного ефекту, оскільки дані з самого початку вводилися підряд. Після цього вектор сортується за допомогою власного функціонального об’єкту comparePersons(). Він впорядковує елементи, на які посилаються вказівники, а не самі значення вказівників. В результаті об’єкти person впорядковуються в алфавітному порядку. #include<iostream> #include<conio> #include<vector> #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&);
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); };
//функціональний обєкт для порівняння вмісту class comparePersons {public: bool operator() (const person* ptrp1, const person* ptrp2) const {return *ptrp1<*ptrp2; } }; //функціональний обєкт для виводу персональних даних //збережених у вказівниках class displayPerson {public: void operator() (const person* ptrp) const {ptrp->display(); } }; ////////////
int main() {vector <person*> vectptrspers;
person* ptrp1=new person("Annie","Mannie",5667888); person* ptrp2=new person("Billie","Sonny",5667889); person* ptrp3=new person("Rymmie","Catty",5667880); person* ptrp4=new person("Annie","Mannie",9667888); person* ptrp5=new person("Holly","Yvette",5667888);
vectptrspers.push_back(ptrp1);//занесення даних у множину vectptrspers.push_back(ptrp2); vectptrspers.push_back(ptrp3); vectptrspers.push_back(ptrp4); vectptrspers.push_back(ptrp5);
for_each(vectptrspers.begin(),vectptrspers.end(), displayPerson()); sort(vectptrspers.begin(),vectptrspers.end()); cout<<"\n\nVporiadkowani vkazivnyky:"; for_each(vectptrspers.begin(),vectptrspers.end(), displayPerson());
sort(vectptrspers.begin(),vectptrspers.end(),comparePersons()); cout<<"\n\nVporiadkowani personalni dani:"; for_each(vectptrspers.begin(),vectptrspers.end(), displayPerson()); while(!vectptrspers.empty()) {delete vectptrspers.back(); //видалення персони vectptrspers.pop_back();//виштовхування вказівника } cout<<endl; getch(); return 0; }
Програма 15.34
|
||
|
Последнее изменение этой страницы: 2021-12-15; просмотров: 77; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.005 с.) |