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

22.5.1. Робота з відображеннями

Створити пару "ключ-значення" можна або за допомогою конструкторів класу pair, або шляхом виклику функції make_pair(), яка створює парний об'єкт на основі типів даних, що використовуються як параметри. Функція make_pair() – це узагальнена функція, прототип якої має такий вигляд:

template <class kType, class vType>

pair<kType, vType> make_pair(const kType &k, const vType &v);

Табл. 22.4. Функції-члени, визначені у класі map

Функція-член

Призначення

iterator begin();

const_iterator begin() const;

Повертає ітератор для першого елемента у відображенні

void clear();

Видаляє всі елементи з відображення

size_type count(

const key_type &k) const;

Повертає кількість входжень ключа k у відображенні (1 або 0)

bool empty() const;

Повертає значення true, якщо це відображення порожнє, і значення false – в іншому випадку

iterator end();

const_iterator end() const;

Повертає ітератор, який вказує на кінець відображення

pair<iterator, iterator> equal_range(const key_type &k);

pair<const_iterator, const_iterator>

equal_range(

const key_type &k) const;

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

void erase(iterator i);

Видаляє елемент, на який вказує ітератор i

void erase(iterator start, iterator end);

Видаляє елементи у діапазоні, що задаються параметрами start і end

size_type erase(

const key_type &k);

Видаляє з відображення елементи, ключі яких мають значення k

iterator find(const key_type &k); const_iterator find(

const key_type &k) const;

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

allocator_type

get_allocator() const;

Повертає розподільник пам'яті відображення

iterator insert(iterator i,

const value_type &val);

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

template<class InIter>

void insert(InIter start,

InIter end);

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

pair<iterator, bool>

insert(const value_type &val);

Вставляє значення val у відображення, що викликається. Повертає ітератор, який вказує на цей елемент. Елемент вставляється тільки у тому випадку, якщо його ще немає у відображенні. Якщо елемент було вставлено, то повертає значення pair<iterator, true>, інакше – значення pair<iterator, false>

key_compare key_Сomp() const;

Повертає об'єкт-функцію, яка порівнює ключі

iterator lower_bound(

const key_type &k);

const_iterator lower_bound(

const key_type &k) const;

Повертає ітератор для першого елемента у відображенні, ключ якого дорівнює значенню k або більше за це значення

size_type max_size() const;

Повертає максимальну кількість елементів, яку може містити це відображення

reference operator[](

const key_type &i);

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

reverse_iterator rbegin();

const_reverse_iterator rbegin() const;

Повертає реверсивний ітератор, який відповідає кінцю відображення

reverse_iterator rend();

const_reverse_iterator rend() const;

Повертає реверсивний ітератор, який відповідає початку відображення

size_type size() const;

Повертає поточну кількість елементів у відображенні

void swap(map<Key, myType,

Сomp Allocator> &ob);

Виконує обмін елементами відображення, що викликається, і відображення ob|

iterator upper_bound(

const key_type &k);

const_iterator upper_bound(

const key_type &k) const;

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

value_compare value_Сomp() const;

Повертає об'єкт-функцію, яка порівнює значення

Як бачите, функція make_pair() повертає парний об'єкт, який складається із значень, типи яких задано параметрами kType і vType. Перевага використання функції make_pair() полягає у тому, що типи об'єктів, які об'єднуються у пару, визначаються автоматично компілятором, а не безпосередньо задаються програмістом.

Можливості використання відображення продемонстровано у наведеному нижче коді програми. У цьому випадку у відображенні зберігається 10 пар "ключ-значення". Ключем слугує символ, а значенням – ціле число. Пари "ключ-значення" зберігаються так:

А 0

В 1

С 2

і т.д. Після збереження пар у відображенні користувачу пропонується ввести ключ (тобто букву з діапазону A-J), після чого виводиться значення, пов'язане з цим ключем.

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

#include <vcl>

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

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

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

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

int main()

{

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

int i;

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

for(i=0; i<10; i++) {

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

}

char ch;

cout << "Введіть ключ: "; cin >> ch;

map<char, int>::iterator p;

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

p = mzm.find(ch);

if(p != mzm.end()) cout << p->second;

else cout << "Такого ключа у відображенні немає.\n";

getch(); return 0;

}

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

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

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

mzm.insert(make_pair((char)('A'+izm), izm));

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