Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

22.5.2. Зберігання у відображенні об'єктів класу

Подібно до всіх інших контейнерів, відображення можна використовувати для зберігання об'єктів, створюваних Вами типів. Наприклад, наведений нижче код програми створює простий словник на основі відображення слів з їх значеннями. Але спочатку вона створює два класи word і meaning. Оскільки відображення підтримує відсортований список ключів, програма також визначає для об'єктів типу word оператора "<". У загальному випадку оператор "<" необхідно визначати для будь-яких класів, які Ви плануєте використовувати як ключі. Деякі компілятори можуть зажадати визначення і інших операторів порівняння.

Код програми 22.12. Демонстрація механізму використання відображення для створення словника

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

#include <map> // Для роботи з асоціативними контейнерами

#include <cstring> // Для роботи з рядковими типами даних

using namespace std; // Використання стандартного простору імен

class word {

char strMas[20];

public:

word() { strcpy(strMas, "");}

word(char *s) { strcpy(strMas, s);}

char *get() { return strMas;}

};

bool operator<(word a_ob, word b_ob)

{

return strcmp(a_ob.get(), b_ob.get()) < 0;

}

class meaning {

char strMas[80];

public:

meaning() { strcmp(strMas, "");}

meaning(char *s) { strcpy(strMas, s);}

char *get() { return strMas;}

};

int main()

{

map<word, meaning> dictionary;

// Поміщаємо у відображення об'єкти класів word і meaning.

dictionary.insert(pair<word, meaning>(

word("дім"), meaning("Місце мешкання.")));

dictionary.insert(pair<word, meaning>(

word("клавіатура"), meaning("Пристрій введення даних.")));

dictionary.insert(pair<word, meaning>(

word("програмування"), meaning("Процес розроблення програми.")));

dictionary.insert(pair<word, meaning>(

word("STL"), meaning("Standard Template Library")));

// За заданим словом знаходимо його значення.

char strMas[80];

cout << "Введіть слово: "; cin >> strMas;

map<word, meaning>::iterator p;

p = dictionary.find(word(strMas));

if(p != dictionary.end())

cout << "Визначення: " << p->second.get();

else

cout << "Такого слова у словнику немає.\n";

getch(); return 0;

}

Один з можливих варіантів виконання цієї програми

Введіть слово: дім

Визначення: Місце мешкання.

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

22.6. Алгоритми оброблення контейнерних даних

Алгоритми обробляють дані, що містяться у контейнерах. Незважаючи на те, що кожен контейнер забезпечує підтримку власних базових операцій, однак стандартні алгоритми дають змогу виконувати більш розширені або складніші дії. Вони також дають змогу виконувати дії з двома різними типами контейнерів одночасно. Для отримання доступу до алгоритмів бібліотеки STL необхідно приєднати до програми заголовок <algorithm>

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

Табл. 22.5. Алгоритми STL

Алгоритм

Призначення

adjacent_find

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

binary_search

Виконує двійковий пошук заданого значення усередині впорядкованої послідовності

copy

Копіює послідовність

copy_backward

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

count

Повертає кількість елементів із заданим значенням у послідовності

count_if

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

equal

Визначає, чи однакові два діапазони

equal_range

Повертає діапазон, у який можна вставити елемент, не порушуючи порядок деякої послідовності

fill, fill_n

Заповнюють діапазон заданим значенням

find

У заданому діапазоні виконує пошук заданого значення і повертає ітератор для першого входження знайденого елемента

find_end

У заданому діапазоні виконує пошук заданої послідовності. Повертає ітератор, який відповідає кінцю шуканої послідовності

find_first_of

Виконує пошук першого елемента усередині заданої послідовності, який збігається з будь-яким елементом із заданого діапазону

find_if

У заданому діапазоні виконує пошук елемента, для якого визначений користувачем унарний предикат повертає значення true

for_each

Застосовує задану функцію до заданого діапазону елементів

generate, generate_n

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

includes

Встановлює факт внесення всіх елементів однієї заданої послідовності в іншу задану послідовність

inplace_merge

Об'єднує один заданий діапазон з іншим. Обидва діапазони мають бути відсортовані у порядку зростання Після виконання алгоритму отримана послідовність сортується у порядку зростання

iter_swap

Змінює місцями значення, що адресуються ітераторами, які передаються як параметри

lexicographical_compare

Порівнює одну задану послідовність з іншою в лексикографічному порядку

lower_bound

Виконує пошук першого елемента у заданій послідовності, значення якого є не меншим від заданого значення

make_heap

Створює купу із заданої послідовності

max

Повертає максимальне з двох значень

max_element

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

merge

Об'єднує дві впорядковані послідовності, поміщаючи результат у третю послідовність

min

Повертає мінімальне з двох значень

min_element

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

mismatch

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

next_permutation

Створює наступну перестановку заданої послідовності

nth_element

Упорядковує задану послідовність так, щоби всі елементи, значення яких є меншим від значення Е, розміщувалися перед цим елементом, а всі елементи, значення яких є більшим від значення Е, розміщувалися після нього

partial_sort

Сортує заданий діапазон

partial_sort_copy

Сортує заданий діапазон, а потім копіює стільки елементів, скільки може поміститися в остаточну послідовність

partition

Сортує задану послідовність так, щоб всі елементи, для яких заданий предикат повертає значення true, розміщувалися перед елементами, для яких цей предикат повертає значення false

pop_heap

Змінює місцями перший і передостанній елементи заданого діапазону, а потім перебудовує купу

prev_permutation

Створює попередню перестановку послідовності

push_heap

Поміщає елемент у кінець купи

random_shuffie

Додає випадковий характер заданій послідовності

remove, remove_if, remove_copy, remove_copy_if

Видаляють елементи із заданого діапазону

replace, replace_copy, replace_if, replace_copy_if

Замінюють задані елементи з діапазону іншими елементами

reverse, reverse_copy

Змінює порядок слідування елементів у заданому діапазоні на протилежний

rotate, rotate_copy

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

search

Виконує пошук однієї послідовності усередині іншої

search_n

Усередині деякої послідовності виконує пошук заданої кількості подібних елементів

set_difference

Створює послідовність, яка містить різницю двох впорядкованих множин

set_intersection

Створює послідовність, яка містить перетин двох впорядкованих множин

set_symmetric_difference

Створює послідовність, яка містить симетричну різницю двох впорядкованих множин

set_union

Створює послідовність, яка містить об'єднання двох впорядкованих множин

sort

Сортує заданий діапазон

sort_heap

Сортує купу у заданому діапазоні

stable_partition

Упорядковує задану послідовність так, щоб всі елементи, для яких заданий предикат повертає значення true, розміщувалися перед елементами, для яких цей предикат повертає значення false. Таке розбиття є стабільним, що означає збереження відносного порядку послідовності

stable_sort

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

swap

Змінює місцями задані два значення

swap_ranges

Виконує обмін елементів у заданому діапазоні

transform

Застосовує функцію до заданого діапазону елементів і зберігає результат у новій послідовності

unique, unique_copy

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

upper_bound

Знаходить останній елемент у заданій послідовності, який є не більшим від заданого значення