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

Int mainO

{

map<char, int> h; // Створення порожнього відображення.

// Поміщаємо пари у відображення.

for(int і=0; і<10; і++) {

h.insert(pair<char, int>('A'+i, і));

}

char ch;

cout « "Введіть ключ: "; сіп » ch;

map<char, int>::iteratorp;

// Знаходимо значення за заданим ключем.

р = h.find(ch);

if(p != h.end()) cout « p->second;

else cout « "Такого ключа у відображенні немає" « endl;

getchQ; return 0;

Зверніть увагу на використання шаблонного класу pair для побудови пар "ключ-значення". Типи даних, які задаються раіг-виразом, повинні відповідати ти­пам відображення, в які вставляються ці пари.

Після ініціалізації відображення ключами і значеннями можна виконувати пошук значення за заданим ключем, використовуючи функцію find(). Ця функція повертає ітератор, який вказує на потрібний елемент або на кінець відображення, якщо заданого ключа не було знайдено. Внаслідок виявлення збігу значення, по­в'язаного з ключем, можна знайти в члені second парного об'єкта типу pair.

У наведеному вище прикладі пари "ключ-значення" створювалися безпосе­редньо за допомогою шаблону pair<char, int>. І хоча у цьому немає нічого непра­вильного, часто простіше використовувати з цією метою функцію make_pair(), яка створює pair-об'єкт на основі типів даних, які використовуються як параметри. Наприклад, цей рядок коду програми також дасть змогу вставити у відображення h пари "ключ-значення" (при використанні попереднього коду програми):

h. insert(make_pair((char)('A'+c), с));

У цьому записі, як бачите, здійснюється операція приведення до типу char, яка необхідна для перевизначення автоматичного перетворення в тип int результа­ту додавання значення і з символом 'А'.

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

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

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

#include <vcl> #include <iostream> #include <conio> #include <map> #include <cstring> using namespace std;

створення словника

// Для потокового введення-виведення // Для консольного режиму роботи // Для роботи з асоціативними контейнерами // Для роботи з рядковими типами даних // Використання стандартного простору імен

class word {

char str[20]; public:

wordO {strcpy(str,} word(char*s) {strcpy(str, s);} char*get() {return str;}

};

bool operator<(word ObjA, word ObjB)

{

return strcmp(ObjA.getO, ObjB.getO) < 0;

}

class meaning { char str[80]; public:

meaningO {strcmp(str,} meaning(char*s) {strcpy(str, s);} char*getO {return str;}

};

int mainO

{

map<word, meaning> dictionary;

// Поміщаємо у відображення об'єкти класів word і meaning. dictionary.insert(pair<word, meaning>(

word("fliM"), meaningC'Micqe мешкання.")));

dictionary.insert(pair<word, meaning>(

word("KnaBiaTypa"), теапіпд("Пристрій введення даних.")));

dictionary.insert(pair<word, meaning>(

word("пpoфaмyвaння"), теапіпд("Процес розроблення програми.")));

dictionary.insert(pair<word, meaning>(

wordfSTL"), meaningfStandard Template Library")));

// За заданим словом знаходимо його значення, char str[80];

cout«"Введіть слово:"; сіп » str;

map<word, meaning>::iteratorp; p = dictionary.find(word(str)); if(p != dictionary.endO)

cout«"Визначення:" « p->second.getO;

else

cout«"Такого слова у словнику немає" « endl; getchO; return 0;

}

Один з можливих варіантів виконання цієї програми Введіть слово: дім Визначення: Місце мешкання.

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

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

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

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

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

Алгоритм

Призначення

1

2

adjacent_find

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

binary_search

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

сору

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

copy_backward

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

count

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

countjf

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

equal

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

equal_range

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

fill, fill n

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

find

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

find_end

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

find_first_of

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

findjf

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

for each

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

generate, generate_n

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

includes

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


1

2

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, remo­ve copy, remove copy if

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

replace, replace_copy, repla­ce if, replace copy if

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

reverse, reverse_copy

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

rotate, rotate_copy

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

search

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

search_n

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

set_difference

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

1

2

set_intersection

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

set_symmetric_difference

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

set_union

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

sort

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

sort heap

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

stable_partition

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

stable_sort

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

swap

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

swap ranqes

Здійснює обмін елементів у заданому діапазоні

transform

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

unique, unique copy

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

upper_bound

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

  1. Обчислення кількості елементів

Одна з найпопулярнішнх операцій, яку можна виконати для будь-якої послі­довності елементів, - це обчислення їх кількості. Для цього можна використовува­ти один з алгоритмів: count() або count_if(). Загальний формат цих алгоритмів має такий вигляд:

template <class Inlter, class myType>

ptrdiff_t count(lnlter start, Inlter end, const myType &val)\

template <class Inlter, class UnPred>

ptrdiff_t count_if(lnlter start, Inlter end, UnPred p/77);

Алгоритм countO повертає кількість елементів послідовності, які дорівнюють значенню val, межі якої задані параметрами start і end. Алгоритм count_if(), діючи у послідовності, межі якої задані параметрами start і end, повертає кількість елемен­тів, для яких унарний предикат pfn повертає значення true. Тип ptrdiff_t визна­чається як певний різновид цілочисельного типу.

Механізм використання алгоритмів countO і count_if() продемонстровано у на­веденому нижче коді програми.

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

#include <vcl>

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

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

#include <vector> // Для роботи з контейнерним класом "Вектор"

#include <algorithm> // Для роботи з алгоритмами бібліотеки STL

#include <cctype> // Для роботи з символьними аргументами

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

// Це унарний предикат, який визначає, чи представляє цей символ голосний звук, //абвгдеєжзиіїйклмнопрстуфхцчшщюяь bool isvowel(charch){ ch = tolower(ch);

if(ch=='a' || ch=='e' || ch=='e' || ch=='n'

|| ch=='i' || ch==T || ch=='o' || ch=='y' jj ch=='io' || сіі=='я') return true; return false;

}