Материал: LW_6_STL_Sontainers_adapters

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

stack <int>::size_type i; i = s1.size();

cout << "Размер стека равен " << i << "." << endl; i = s1.top();

cout << "Элемент на вершине стека " << i << "." << endl; s1.pop();

i = s1.size();

cout << "После извлечения элемента из стека размер равен " << i << "." << endl;

i = s1.top();

cout << "После извлечения элемента из стека элемент на вершине стека " << i << "." << endl;

}

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

Каждый контейнер-адаптер определяет собственные функции, исходя из функций, предоставленных базовым контейнером. Использовать можно только функции адаптера, а функции основного контейнера использовать нельзя.

АДАПТЕРЫ ОЧЕРЕДЕЙ

Адаптеры queue и priority_queue определены в заголовке <queue>. Список функций, поддерживаемых этими типами, приведен в таблице ниже.

По умолчанию адаптер queue использует контейнер deque, а адаптер priority_queue — контейнер vector; адаптер queue может использовать также контейнер list или vector, адаптер priority_queue может использовать контейнер deque.

Таблица – Основные функции адаптеров queue и priority_queue

Метод

Выполняемое действие

 

 

reference back()

Возвращает ссылку на последний добавленный элемент

const_reference back() const

в конце очереди. Используется для контейнера queue

bool empty() const

Проверяет, пуста

ли очередь. Используется для

контейнера queue и priority_queue

 

reference front()

Возвращает ссылку на первый элемент в начале очереди.

const_reference front() const

Используется для контейнера queue

void pop()

Удаляет элемент

из начала очереди. Удаляет самый

большой элемент из priority_queue из начала

 

void push(const Type& val)

Добавляет элемент в конец очереди. Добавляет элемент в

priority_queue на основании приоритета элемента

 

size_type size() const

Возвращает количество элементов в очереди

 

Возвращает, но не удаляет элемент с самым высоким

const_reference top() const

приоритетом. Возвращает константную ссылку на самый

 

большой элемент в начале priority_queue

Библиотечный класс queue использует хранилище, организованное по принципу "первым пришел, первым вышел" (first-in, first-out FIFO).

Поступающие в очередь объекты помещаются в ее конец, а извлекаются из ее начала, при этом выбранный элемент из очереди удаляется.

Адаптер priority_queue позволяет установить приоритет хранимых элементов. Добавляемые элементы помещаются перед элементами с более низким приоритетом. По умолчанию для определения относительных приоритетов в библиотеке используется оператор <.

//Пример №3. Использование методов front() и back() контейнера queue #include <queue>

#include <iostream> using namespace std; int main() {

system("chcp 1251"); system("cls");

queue <int> queueInt; queueInt.push(111); queueInt.push(101); queueInt.push(110); queueInt.push(12); queueInt.push(12); queueInt.push(13);

int& element = queueInt.back();

const int& otherElement = queueInt.front();

cout << "Номер, находящийся в конце очереди:" << element << "." << endl;

cout << "Номер, находящийся в начале очереди:" << otherElement << "." << endl;

}

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

//Пример №4. Использование класса priority_queue #include <queue>

#include <iostream> using namespace std; int main() {

system("chcp 1251"); system("cls"); priority_queue<int> intQueue; intQueue.push(10); intQueue.push(30); intQueue.push(20);

priority_queue<int>::size_type queueSize; queueSize = intQueue.size();

cout << "Длина очереди с приоритетом равна " << queueSize << "." << endl;

const int& ii = intQueue.top();

cout << "В начале очереди находится элемент с номером " << ii << "." << endl;

}

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

//Пример №5. Использование класса priority_queue с указанием компаратора

#include <queue> #include <vector> #include <iostream> using namespace std; template<typename T>

void printQueue(T& queue) { while (!queue.empty()) {

cout << queue.top() << " "; queue.pop();

}

cout << '\n';

}

int main() { priority_queue<int> queue;

for (int n : {1, 8, 5, 6, 3, 4, 0, 9, 7, 2}) queue.push(n);

printQueue(queue);

priority_queue<int, vector<int>, greater<int>> q2; for (int n : {1, 8, 5, 6, 3, 4, 0, 9, 7, 2})

q2.push(n);

printQueue(q2);

}

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

//Пример №6. Использование класса priority_queue с пользовательскими типами

#include <iostream> #include <queue> #include <iomanip> using namespace std; struct Time {

int h; // >= 0 int m; // 0-59 int s; // 0-59

};

class CompareTime {

public:

bool operator()(Time& t1, Time& t2)

{

if (t1.h < t2.h) return true;

if (t1.h == t2.h && t1.m < t2.m) return true;

if (t1.h == t2.h && t1.m == t2.m && t1.s < t2.s) return

true;

return false;

}

}; //Третий параметр шаблонного класса должен быть классом, у которого operator()

priority_queue<Time, vector<Time>, CompareTime> pq; int main() {

priority_queue<Time, vector<Time>, CompareTime> pq; // Array of 4 time objects:

Time t[4] = { {3, 2, 40}, {3, 2, 26}, {5, 16, 13}, {5, 14, 20} }; for (int i = 0; i < 4; ++i)

pq.push(t[i]); while (!pq.empty()) {

Time t2 = pq.top();

cout << setw(3) << t2.h << " " << setw(3) << t2.m << " " << setw(3) << t2.s << endl;

pq.pop();

}

return 0;

}

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

//Пример №7. Использование класса priority_queue с указанием способа сравнения

#include <queue> #include <string> #include <iostream> using namespace std; class Student { public:

string chName; int nAge;

Student() : chName(" "), nAge(0) {}

Student(string chNewName, int nNewAge) :chName(chNewName), nAge(nNewAge) {}

}; //перегрузка оператора <

bool operator< (const Student& st1, const Student& st2) { return st1.nAge > st2.nAge;

}

//перегрузка оператора >

bool operator> (const Student& st1, const Student& st2) { return st1.nAge < st2.nAge;

}

int main() { system("chcp 1251"); system("cls");

//Создание priority_queue и указание порядка элементов как < //Элементы очереди будут расположены в порядке увеличения

возраста

priority_queue<Student, vector<Student>, less<vector<Student>::value_type>> pqStudent1;

//Создание priority_queue и указание порядка элементов как > //Элементы очереди будут расположены в порядке уменьшения

возраста

priority_queue<Student, vector<Student>, greater<vector<Student>::value_type>> pqStudent2;

//добавление элементов в контейнер pqStudent1.push(Student("Иванов Марк", 38)); pqStudent1.push(Student("Петров Илья", 25)); pqStudent1.push(Student("Симонов Петр", 47)); pqStudent1.push(Student("Григорьев Андрей", 13)); pqStudent1.push(Student("Петровичев Иван", 44)); //отображение элементов контейнера

while (!pqStudent1.empty()) {

cout << pqStudent1.top().chName << endl; pqStudent1.pop();

}

cout << endl;

//добавление элементов в контейнер pqStudent2.push(Student("Иванов Марк", 38)); pqStudent2.push(Student("Петров Илья", 25)); pqStudent2.push(Student("Симонов Петр", 47)); pqStudent2.push(Student("Григорьев Андрей", 13)); pqStudent2.push(Student("Петровичев Иван", 44)); //отображение элементов контейнера

while (!pqStudent2.empty()) {

cout << pqStudent2.top().chName << endl; pqStudent2.pop();

}

cout << endl; return 0;

}

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

ВОПРОСЫ И УПРАЖНЕНИЯ ДЛЯ ЗАКРЕПЛЕНИЯ МАТЕРИАЛА ЛАБОРАТОРНОЙ РАБОТЫ №6:

1. Что собой представляет вектор (vector) в C++?