Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Класс queue: односторонняя очередь
Класс queue
реализует очередь «первым пришел, первым ушел» (обычная очередь, например, за билетами в кинотеатр, — чем раньше встали в очередь, тем быстрее купите билет) на основе последовательного контейнера. По умолчанию в качестве контейнера используется класс deque
. Объявление класса queue
выглядит следующим образом:
template<typename _Tp, typename _Sequence = deque<_Tp> >
class queue;
Прежде чем использовать класс, необходимо в начало программы добавить инструкцию:
#include <queue>
Создать экземпляр класса queue
можно следующими способами (полный список конструкторов смотрите в документации):
- объявить переменную без инициализации. Для этого перед названием переменной указывается название класса, а после названия внутри угловых скобок задается тип данных. В этом случае очередь не содержит элементов. Пример объявления без инициализации, добавления элементов в конец очереди, получения и удаления элементов из начала очереди:
std::queue<int> q;
q.push(1); // Добавляем элементы
q.push(2);
q.push(3);
while (!q.empty()) {
std::cout << q.front() << ' '; // Получаем значение
q.pop(); // Удаляем первый элемент
}
std::cout << std::endl; // 1 2 3
Внутри угловых скобок после типа данных можно дополнительно указать тип контейнера. По умолчанию в качестве контейнера используется класс deque
. Вместо класса deque
можно использовать класс list
. Класс vector
в этом случае использовать нельзя, так как у него нет метода для удаления элемента из начала контейнера. Пример указания класса list
:
std::queue<int, std::list<int> > q;
- внутри круглых скобок указать объект, имеющий тип контейнера. В этом случае все элементы из контейнера будут скопированы в очередь или перемещены:
// Копирование элементов из списка
std::list<int> my_list = {1, 2, 3};
std::queue<int, std::list<int> > q(my_list);
while (!q.empty()) {
std::cout << q.front() << ' ';
q.pop();
}
std::cout << std::endl; // 1 2 3
std::cout << my_list.size() << std::endl; // 3
// Перемещение элементов из очереди
std::deque<int> my_deque = {4, 5, 6};
std::queue<int> q2(std::move(my_deque));
while (!q2.empty()) {
std::cout << q2.front() << ' ';
q2.pop();
}
std::cout << std::endl; // 4 5 6
std::cout << my_deque.size() << std::endl; // 0
- указать объект класса
queue
внутри круглых скобок или после оператора=
(можно создать копию объекта или переместить элементы):
std::deque<int> my_deque = {1, 2, 3};
std::queue<int> q1(my_deque);
std::queue<int> q2(q1); // Копирование
std::queue<int> q3(std::move(q1)); // Перемещение
Над двумя объектами класса queue
определены операции ==
, !=
, <
, <=
, >
и >=
. Пример сравнения двух объектов:
std::deque<int> my_deque = {1, 2, 3};
std::queue<int> q1(my_deque), q2(q1);
if (q1 == q2) {
std::cout << "q1 == q2" << std::endl;
}
С помощью оператора =
можно создать копию или переместить элементы:
std::deque<int> my_deque = {1, 2, 3};
std::queue<int> q1(my_deque), q2;
q2 = q1; // Копирование
std::cout << q1.size() << std::endl; // 3
std::cout << q2.size() << std::endl; // 3
q2 = std::move(q1); // Перемещение
std::cout << q2.size() << std::endl; // 3
std::cout << q1.size() << std::endl; // 0
Класс queue
содержит следующие методы:
size()
— возвращает количество элементов в очереди. Прототип метода:
size_type size() const;
Пример:
std::deque<int> my_deque = {1, 2, 3};
std::queue<int> q(my_deque);
std::cout << q.size() << std::endl; // 3
empty()
— возвращает значениеtrue
, если очередь не содержит элементов, иfalse
— в противном случае. Прототип метода:
bool empty() const;
Пример:
std::deque<int> my_deque = {1, 2, 3};
std::queue<int> q1(my_deque), q2;
std::cout << std::boolalpha;
std::cout << q1.empty() << std::endl; // false
std::cout << q2.empty() << std::endl; // true
push()
— добавляет элемент в конец очереди. Прототипы метода:
void push(const value_type &x);
void push(value_type &&x);
Пример:
std::queue<int> q;
q.push(1); q.push(2); q.push(3);
while (!q.empty()) {
std::cout << q.front() << ' ';
q.pop();
}
std::cout << std::endl; // 1 2 3
emplace()
— создает объект, передавая конструктору указанные через запятую значения, а затем добавляет объект в конец очереди. Начиная со стандарта C++17, метод возвращает ссылку на созданный объект:
class C {
public:
int x, y;
C(int a, int b) : x(a), y(b) { }
};
// ... Фрагмент опущен ...
std::queue<C> q;
q.emplace(10, 20); q.emplace(30, 40); q.emplace(50, 60);
while (!q.empty()) {
std::cout << q.front().x << ' ';
q.pop();
}
std::cout << std::endl; // 10 30 50
front()
— возвращает ссылку на первый элемент в очереди. Элемент из очереди не удаляется. Прототипы метода:
reference front();
const_reference front() const;
back()
— возвращает ссылку на последний элемент в очереди. Элемент из очереди не удаляется. Прототипы метода:
reference back();
const_reference back() const;
pop()
— удаляет первый элемент из очереди. Прототип метода:
void pop();
Пример:
std::deque<int> my_deque = {1, 2, 3};
std::queue<int> q(my_deque);
std::cout << q.front() << std::endl; // 1
std::cout << q.back() << std::endl; // 3
q.front() = 0;
q.back() = 4;
std::cout << q.front() << std::endl; // 0
std::cout << q.back() << std::endl; // 4
q.pop();
std::cout << q.front() << std::endl; // 2
swap()
— меняет элементы двух контейнеров местами. Прототип метода:
void swap(queue &q);
Пример:
std::deque<int> my_deque = {1, 2, 3};
std::queue<int> q1(my_deque), q2;
q2.push(4);
q1.swap(q2);
std::cout << q1.size() << std::endl; // 1
std::cout << q2.size() << std::endl; // 3
Вместо метода swap()
можно воспользоваться одноименной функцией:
std::deque<int> my_deque = {1, 2, 3};
std::queue<int> q1(my_deque), q2;
q2.push(4);
std::swap(q1, q2);
std::cout << q1.size() << std::endl; // 1
std::cout << q2.size() << std::endl; // 3
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов