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++?