Spec-Zone.ru › C++

std::queue

Определён в заголовочном файле <queue>
template<
    class T,
    class Container = std::deque<T>
> class queue;

Шаблон класса std::queue — это адаптер контейнера, предоставляющий функциональность очереди, а именно структуры данных FIFO (первым пришёл — первым вышел).

Шаблон класса служит оболочкой для базового контейнера — предоставляется только определённый набор функций. Очередь помещает элементы в конец базового контейнера и извлекает их из начала.

Все функции-члены std::queue являются constexpr: объекты std::queue можно создавать и использовать при вычислении константного выражения.

Однако объявление переменной std::queue со спецификатором constexpr обычно является ошибкой, поскольку при константном вычислении динамически выделенная память должна освобождаться в ходе того же вычисления, чего обычно не происходит при инициализации std::queue.

(начиная с C++26)

Параметры шаблона

T - Тип хранимых элементов. Программа некорректна, если T не совпадает по типу с Container::value_type.
Container - Тип базового контейнера, используемого для хранения элементов. Контейнер должен соответствовать требованиям SequenceContainer. Кроме того, он должен предоставлять следующие функции с обычной семантикой:
  • back(), например, std::deque::back(),
  • front(), например, std::list::front(),
  • push_back(), например, std::deque::push_back(),
  • pop_front(), например, std::list::pop_front().

Стандартные контейнеры std::deque и std::list удовлетворяют этим требованиям.

Типы-члены

Тип-член Определение
container_type Container
value_type Container::value_type
size_type Container::size_type
reference Container::reference
const_reference Container::const_reference

Объекты-члены

Член Описание
Container c
базовый контейнер
(защищённый объект-член)

Функции-члены

(constructor)
создаёт queue
(открытая функция-член)
(destructor)
уничтожает queue
(открытая функция-член)
operator=
присваивает значения адаптеру контейнера
(открытая функция-член)
Доступ к элементам
front
доступ к первому элементу
(открытая функция-член)
back
доступ к последнему элементу
(открытая функция-член)
Ёмкость
empty
проверяет, пуст ли адаптер контейнера
(открытая функция-член)
size
возвращает количество элементов
(открытая функция-член)
Модификаторы
push
вставляет элемент в конец
(открытая функция-член)
push_range
(C++23)
вставляет диапазон элементов в конец
(открытая функция-член)
emplace
(C++11)
создаёт элемент непосредственно в конце
(открытая функция-член)
pop
удаляет первый элемент
(открытая функция-член)
swap
(C++11)
меняет содержимое местами
(открытая функция-член)

Функции, не являющиеся членами

operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++20)
лексикографически сравнивает значения двух объектов queue
(шаблон функции)
std::swap(std::queue)
(C++11)
специализирует алгоритм std::swap
(шаблон функции)

Вспомогательные классы

std::uses_allocator<std::queue>
(C++11)
специализирует характеристику типа std::uses_allocator
(специализация шаблона класса)
std::formatter<std::queue>
(C++23)
поддержка форматирования для std::queue
(специализация шаблона класса)

Руководства по выведению типов

(начиная с C++17)

Примечания

Макрос проверки поддержки возможностей Значение Стандарт Возможность
__cpp_lib_containers_ranges 202202L (C++23) Создание и вставка в контейнеры с использованием диапазонов
__cpp_lib_constexpr_queue 202502L (C++26) Константное вычисление для std::queue

Пример

#include <cassert>
#include <iostream>
#include <queue>

int main()
{
    std::queue<int> q;

    q.push(0); // back pushes 0
    q.push(1); // q = 0 1
    q.push(2); // q = 0 1 2
    q.push(3); // q = 0 1 2 3

    assert(q.front() == 0);
    assert(q.back() == 3);
    assert(q.size() == 4);

    q.pop(); // removes the front element, 0
    assert(q.size() == 3);

    // Print and remove all elements. Note that std::queue does not
    // support begin()/end(), so a range-for-loop cannot be used.
    std::cout << "q: ";
    for (; !q.empty(); q.pop())
        std::cout << q.front() << ' ';
    std::cout << '\n';
    assert(q.size() == 0);
}

Вывод:

q: 1 2 3

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
LWG 307 C++98 std::queue не поддерживал контейнеры, использующие прокси-типы
ссылок[1] вместо (const) value_type&
поддерживаются
LWG 2566 C++98 Отсутствовало требование к Container::value_type программа некорректна, если T не совпадает по типу с Container::value_type
  1. Например, контейнеры, подобные std::vector<bool>, с дополнительной поддержкой pop_front(). Решение этого отчёта об ошибке
    добавило поддержку std::vector<bool> для std::stack и std::priority_queue. Изменения, связанные с std::queue,
    внесены для обеспечения согласованности.

См. также

priority_queue
адаптирует контейнер для предоставления очереди с приоритетами
(шаблон класса)
deque
двусторонняя очередь
(шаблон класса)
list
двусвязный список
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/queue

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API