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

22.5. Поняття про відображення

Клас map підтримує асоціативний контейнер, у якому унікальним ключам відповідають певні значення. По суті, ключ – це просто ім'я, яке присвоєне певному значенню. Після того, як значення збережено у контейнері, до нього можна отримати доступ, використовуючи його ключ. Таким чином, в найширшому сенсі відображення – це список пар "ключ-значення". Якщо нам відомий ключ, то ми можемо легко знайти значення. Наприклад, ми могли б визначити відображення, у якому як ключ використовують ім'я людини, а як значення – його телефонний номер. Асоціативні контейнери стають все більш популярними у програмуванні.

Відображення – це асоціативний контейнер.

Як ми вже зазначали вище, відображення може зберігати тільки унікальні ключі. Ключі-дублі­ка­ти не дозволені. Щоб створити відображення, яке б давало змогу зберігати не унікальні ключі, використовується клас multimap.

Контейнер map має наступну шаблонну специфікацію.

template<class Key, class myType, class Сomp = less<Key>,

class Allocator = allocator<pair<const Key myType>>> class map

Тут Key – тип даних ключів, myType – тип значень, що зберігаються (що відображаються), а Сomp – функція, яка порівнює два ключі. За замовчуванням як функція порівняння використовується стандартна функція-об'єкт less. Елемент Allocator означає розподільник пам'яті, який за замовчуванням використовує стандартний розподільник allocator. Клас map має такі конструктори:

explicit map(const Сomp &cmpfn = Сomp(),

const Allocator &a = Allocator());

map(const map<Key, myType, Сomp Allocator> &ob>);

template<class InIter> map(InIter start, InIter end,

const Сomp &cmpfn = Сomp(), const Allocator &a = Allocator());

Перша форма конструктора створює порожнє відображення. Друга призначена для створення відображення, яке містить ті самі елементи, що і відображення ob. Третя створює відображення, яке містить елементи у діапазоні, заданому ітераторами start і end. Функція, задана параметром cmpfn (якщо вона задана), визначає характер впорядкування відображення.

У загальному випадку будь-який об'єкт, який використовується як ключ, повинен визначати конструктор за замовчуванням і перевантажувати оператор "<" (а також інші необхідні оператори порівняння). Ці вимоги для різних компіляторів різні.

Для класу map визначено такі оператори порівняння:

==, <, <=, !=, > i >=.

Функції-члени, визначені для класу map, представлено в табл. 22.4. В їх описі під елементом key_type розуміють тип ключа, а під елементом value_type значення виразу pair<Key, myType>.

Пари "ключ-значення" зберігаються у відображенні як об'єкти класу pair, який має таку шаблонну специфікацію:

template <class kType, class vType> struct pair {

typedef kType first_type; // Тип ключа

typedef vType second_type; // Тип значення

kType first; // Містить ключ

vType second; // Містить значення

// Оголошення конструкторів

pair();

pair(const kType &k, const vType &v);

template<class A, class B> pair(const<A, B> &ob);

}

Як зазначено у коментарях до цього фрагменту програми, член first містить ключ, а член second – значення, що відповідає цьому ключу.