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

Void main()

{

priority_queue <int, vector<int>, less<int> > P;

int x;

P.push(13); P.push(51); P.push(200); P.push(17);

while (!P.empty())

{

x = P.top(); cout<<"Вибраний елемент:" << x<<endl;

P.pop();

}

}

Результат роботи програми:

Вибраний елемент: 200

Вибраний елемент: 51

Вибраний елемент: 17

Вибраний елемент: 13

В даному прикладі третім параметром шаблону є шаблон, визначений у заголовному файлі <functional>. Він задає операцію порівняння на "менше". Можна задати стандартні шаблони greater<тип>, gеаtег_еqual<тип>, less_equa1<тип>. Якщо потрібно визначити інший порядок вибірки з черги, вводиться власний функціональний об'єкт. У приведеному нижче прикладі вибірка виконується по найменшій сумі цифр в числі:

#include <iostream>

#include <queue>

using namespace std;

class CompareSum

{

public:

bool operator()(int x, int y)

{

int sx = 0, sy = 0;

while (x){sx += x % 10; x /= 10;}

while (y){sy += y % 10; y /= 10;}

return sx > sy ;

}

};

Void main()

{

priority_queue <int, vector<int>, CompareSum > P;

int x;

P.push(13); P.push(51); P.push(200); P.push(17);

while (!P.empty())

{

x = P.top(); cout <<"Вибраний елемент:"<<x << endl;

P.pop();

}

}

Результат роботи програми:

Вибраний елемент: 200

Вибраний елемент: 13

Вибраний елемент: 51

Вибраний елемент: 17

10.3 Асоціативні контейнери

10.3.1 Загальні відомості про асоціативні контейнери

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

Існує п'ять типів асоціативних контейнерів: словники (mар), словники з дублікатами (multimap), множини (set), множини з дублікатами (multiset) і бітові множини (bitset). Словники часто називають також асоціативними масивами або відображеннями.

Словник побудований на основі пар значень, перше з яких є ключем для ідентифікації елементу, а друге – власне елемент. Можна сказати, що ключ асоційований з елементом, звідки і відбулася назва цих контейнерів. Наприклад, в англо-російському словнику ключем є англійське слово, а елементом – російське. Звичайний масив теж можна розглядати як словник, ключем в якому слугує номер елементу. У словниках, описаних в STL, в якості ключа може використовуватися значення довільного типу. Асоціативні контейнери описані в заголовних файлах <mар> і <set>. Для зберігання пари "ключ-елемент" використовується шаблон pair, описаний в заголовному файлі <utility>:

template <class Tl, class T2> struct pair

{

typedef Tl first_type;

typedef T2 second_type;

Tl first;

T2 second;

pair();

pair(const T1& x, const T2& y);

template <class U,class V> pair(const pair<U, V> &p)

};

Шаблон pair має два параметри, що є типами елементів пари. Перший елемент має ім'я first, другий, – second. Визначено два конструктори: один повинен набувати два значення для ініціалізації елементів, другий (конструктор копіювання), – посилання на іншу пару. Конструктора за умовчанням у пари немає, тобто при створенні об'єкту йому потрібно привласнити значення явним чином. Для пари визначені перевірка на рівність і операція порівняння на менше (решта всіх операцій відношення генерується в STL автоматично на основі цих двох операцій). Пара р1 менше пари р2, якщо р1.first < р2.first або

р1.first == р2.first && р1.second < р2.second.

Для надання значення парі можна використовувати функцію make_pair:

template <class T1, class T2>

pair<T1, T2> make_pair(const T1& x, const T2& y);

Приклад формування пар:

#include <iostream>

#include <utility>

using namespace std;