Класс std::queue<T> представляет очередь - контейнер, который работает по принципу FIFO (first-in first-out или "первый вошел — первым вышел") — первым всегда извлекается первый добавленный элемент. То есть это контейнер, аналогичный стандартной очереди, которая часто встречается в нашей повседневной жизни.
Для работы со очередью надо подключать заголовочный файл <queue>. Определение пустой очереди:
#include <iostream>
#include <queue>
#include <string>
int main()
{
std::queue<std::string> queue; // пустая очередь
}
С помощью функции size() можно получить количество элементов в очереди, а с помощью функции empty() проверить
очередь на наличие элементов (если возвращается true, то очередь пуста):
#include <iostream>
#include <queue>
#include <string>
int main()
{
std::queue<std::string> queue;
if(queue.empty())
{
std::cout << "queue is empty" << std::endl;
}
std::cout << "queue size: " << queue.size() << std::endl; // queue size: 0
}
Для добавления в очередь применяется функция push(), в которую передается добавляемый элемент:
#include <iostream>
#include <queue>
#include <string>
int main()
{
std::queue<std::string> queue; // пустая очередь
// добавляем три элемента
queue.push("Tom");
queue.push("Bob");
queue.push("Sam");
std::cout << "queue size: " << queue.size() << std::endl; // queue size: 3
}
Мы можем получить только самый первый элемент очереди - для этого применяется функция front() и с самый последний с помощью функции back():
#include <iostream>
#include <queue>
#include <string>
int main()
{
std::queue<std::string> queue; // пустая очередь
queue.push("Tom");
queue.push("Bob");
queue.push("Sam");
std::cout << "First: " << queue.front() << std::endl; // First: Tom
std::cout << "Last: " << queue.back() << std::endl; // Last: Sam
}
Для удаления элемента из начала очереди применяется функция pop():
queue.pop()
Комбинируя эту функцию с функцией front() можно извлечь все элементы стека:
#include <iostream>
#include <queue>
#include <string>
int main()
{
std::queue<std::string> queue;
queue.push("Tom");
queue.push("Bob");
queue.push("Sam");
while (!queue.empty()) // пока очередь не пуста
{
std::cout << queue.front() << std::endl;
queue.pop(); // извлекаем первый элемент
}
}
В данном случае, пока очередь не станет пустой, выводим на консоль первый элемент с помощью функции front и затем извлекаем его с помощью функции pop. Консольный вывод программы:
Tom Bob Sam
Очередь можно инициализировать другой очередь. или деком (двусторонней очередью):
#include <iostream>
#include <queue>
#include <string>
int main()
{
std::deque<std::string> people{"Tom", "Sam", "Bob"};
std::queue<std::string> queue {people};
while (!queue.empty())
{
std::cout << queue.front() << std::endl;
queue.pop();
}
}
С помощью функции swap() можно обменять элементы двух очередей:
#include <iostream>
#include <queue>
#include <string>
int main()
{
std::queue<std::string> queue1 {std::deque<std::string>{"Alice", "Kate"}};
std::queue<std::string> queue2;
queue2.push("Tom");
queue2.push("Bob");
// обмен queue1 на queue2
queue1.swap(queue2);
// queue1 = {"Tom", "Bob"}
// queue2 = {"Alice", "Kate"}
}