Функціональний об’єкт comparePersons() 


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



ЗНАЕТЕ ЛИ ВЫ?

Функціональний об’єкт comparePersons()



Якщо ми візьмемо версію алгоритму sort(), що має два аргументи

sort(vectPtrsPers.begin(),vectPtrsPers.end());

то будуть сортуватися тільки вказівники за їх адресами в пам’яті. Таке сортування потрібне вкрай рідко. Щоб впорядкувати об’єкти person за їх іменами, ми скористаємося алгоритмом sort() з трьома аргументами. В якості третього аргументу буде виступати функціональний об’єкт comparePersons()

sort(vectptrspers.begin(),vectptrspers.end(),comparePersons());

Що стосується нашого власного функціонального об’єкту comparePersons(), то його ми визначаємо так:

//функціональний обєкт для порівняння вмісту

class comparePersons

{public:

bool operator() (const person* ptrp1,

const person* ptrp2) const

{return *ptrp1<*ptrp2; }

};

При цьому operator() має два аргументи, що є вказівниками на персональні дані і порівнює значення їх вмісту, а не просто значення вказівників.

 

Функціональний об’єкт displayPerson()

В даній програмі незвичайно здійснюється виведення вмісту контейнеру. Замість протої ітерації з поедементним виводом ми використовуємо функцію for_each() з власним функціональним об’єктом в якості третього аргументу:

for_each(vectptrspers.begin(),vectptrspers.end(),

displayPerson());

Цей вираз приводить до того, що функціональний об’єкт displayPerson() виводиться для кожного елементу даних у векторі. Ось як виглядає об’єкт displayPerson:

//функціональний обєкт для виводу персональних даних

//збережених у вказівниках

class displayPerson

{public:

void operator() (const person* ptrp) const

{ptrp->display(); }

};

Таким чином, за допомогою одного-єдиного виклику функції на екран виводиться вміст всього вектора.

 

 

 

 

 

 

 

 

 

 


 

Підсумок

STL складається з трьох основних компонентів: контейнерів, алгоритмів та ітераторів. Контейнери поділяються на дві групи: послідовні та асоціативні. Послідовними є вектори, списки і черги з двостороннім доступом. Асоціативні контейнери – це множини та відображення, а також тісно з ними зв’язані мультимножини і мультивідображення.

Алгоритми виконують певні операції над контейнерами, так як сортування, копіювання і пошук. Ітератори являють собою різновидність вказівників, що застосовуються до елементів контейнерів, також вони є зв’язуючою ланкою між алгоритмами та контейнерами.

Не всі алгоритми можуть працювати зі всіма контейнерами. Ітератори, зокрема, використовуються для того, щоб впевнитися, що даний алгоритм пасує до даного контейнера. Ітератори визначаються тільки для деяких видів контейнерів і можуть бути аргументами алгоритмів. Якщо ітератор контейнера не відповідає алгоритму, виникає помилка компілятора.

Вхідні та вихідні ітератори використовуються для підключення контейнерів безпосередньо до потоків вводу-виводу. Спеціалізовані ітератори дають можливість проходити контейнери у зворотньому напрямку, а також змінювати поведінку деяких алгоритмів, наприклад, змушуючи їх вставляти дані, а не перезаписувати.

Алгоритми є незалежними функціями, які можуть працювати відразу з багатьма типами контейнерів. У контейнерів є свої власні специфічні методи. В деяких випадках краще працювати з ними, а не з алгоритмами.

Контейнери і алгоритми STL працюють з даними будь-яких типів, класів, взагалі з чим завгодно при наявності перезавантажених операцій типу <.

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

 

Питання по темі

1. Перелічіть послідовні контейнери STL

а. вектор, список, черга з двостороннім доступом

б. вектор, множина, алгоритм

в. множина, мультимножина, однозв’язний список

 

2. Асоціативні контейнери STL:

а. множина, мультимножина, відображення, мультивідображення

б. двозв’язний список, черга

в. вектор, список, масив

 

3. Алгоритм STL – це

а. незалежна функція для роботи з контейнерами

б. зв’язуючий елемент між методами і контейнерами

в. функція, дружня до відповідних класів контейнерів

г. метод відповідних контейнерів.

 

 

4. Алгоритм find()

а. здійснює пошук підходящих послідовностей елементів у двох контейнерів

б. здійснює пошук контейнера, що відповідає заданому

в. в якості перших двох елементів використовує ітератори

г. в якості перших двох аргументів використовує елементи контейнера

 

5. Чи істинне твердження: алгоритми можуть використовуватися лише з контейнерами STL?

а. так

б. ні

 

6. Діапазон часто задається в алгоритмі двома значеннями типу

а. ітераторів

б. вказівників

в. елементів масиву

 

7. Що використовується для зміни поведінки алгоритму?

а. функціональний об’єкт

б. коригуючий алгоритм

в. дружня функція

 

8. Вектор є підходящим контейнером, якщо користувач збирається:

а. вставляти нові елементи в довільні місця контейнера

б. вставляти нові елементи завжди в кінець або початок контейнера

в. має індекс і хоче дістати швидкий доступ до елемента з цим індексом

г. має ключове значення елемента і хоче дістати швидкий доступ до елемента з цим ключем.

 

9. Чи істинне твердження, що back() видаляє елементи з кінця контейнера?

а. так, це руйнуючий метод

б. ні, він просто повертає значення

 

10. Алгоритм unique() видаляє всі___________ елементи з контейнера

а. неунікальні

б. які не задовольняють певну вимогу, вказану серед операндів алгоритму

в. перший елемент контейнера

г. останній елемент контейнера

 

11. Чи істинне твердження, що ітератор завжди може зсовуватися як у прямому, так і у зворотньому напрямку по контейнеру?

а. так, завжди

б. ні, ніколи

в. залежно від типу контейнеру

 

12. Нехай iter – це ітератор контейнера. Який вираз має значенням об’єкт, на який посилається iter, і змушує потім зсунутися iter на наступний елемент контейнера?

а. *iter++

б. *iter

в. **iter

 

13. Алгоритм copy() повертає ітератор на

а. останній елемент, з якого відбувалося копіювання

б. останній елемент, в який проводилося копіювання

в. елемент, що розміщувався після останнього елементу, з якого відбувалося копіювання

г. елемент, що розміщувався після останнього елементу, з якого відбувалося копіювання

 

14. Для того, щоб використовувати reverse_iterator, необхідно:

а. почати з ініціалізації його значенням end()

б. почати з ініціалізації його значенням rend()

в. інкрементувати його для зсуву назад по контейнеру

г. декрементувати його для зсуву назад по контейнеру

 

15. Чи істинне твердження про те, що ітератор back_inserter завжди приводить до того, що новий елемент вставляється після існуючого?

а. так

б. ні

 

16. В асоціативному контейнері

а. значення зберігаються у впорядкованому (просортованому) вигляді

б. ключі впорядковані

в. сортування завжди відбувається в алфавітному порядку або в порядку зростання числових значень

г. необхідно використовувати алгоритм sort() для сортування

 

17. Чи істинне твердження: відображення може мати два чи більше елементів з однаковими ключами?

а. так

б. ні

 

18. При визначенні множини необхідно вказувати спосіб

а. впорядковування елементів

б. додавання елементів

в. вилучення елементів

 

19. Якщо в контейнері зберігаються не елементи, а вказівники на них. то:

а. об’єкти не будуть копіюватися при їх додаванні в контейнер

б. можуть використовуватися лише асоціативні контейнера

в. неможливе сортування за атрибутами об’єкта

г. контейнери будуть займати менше пам’яті

 

20. Якщо ми хочемо, щоб асоціативний контейнер типу set здійснював автоматичне сортування своїх значень, можна визначити порядок сортування спеціальним функціональним об’єктом і вказати його серед ___________ контейнера

а. конструкторів

б. перезавантажених операторів порівняння

в. методів

 



Поделиться:


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

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