Standard library header <queue>
From cppreference.com
This header is part of the containers library.
Includes | |
(C++20) |
Three-way comparison operator support |
(C++11) |
std::initializer_list class template |
Classes | |
| adapts a container to provide queue (FIFO data structure) (class template) | |
| adapts a container to provide priority queue (class template) | |
| specializes the std::uses_allocator type trait (class template specialization) | |
| specializes the std::uses_allocator type trait (class template specialization) | |
Functions | |
lexicographically compares the values of two queues (function template) | |
(C++11) |
specializes the std::swap algorithm (function template) |
| specializes the std::swap algorithm (function template) | |
Synopsis
#include <compare>
#include <initializer_list>
namespace std {
// class template queue
template<class T, class Container = deque<T>> class queue;
template<class T, class Container>
constexpr bool operator==(const queue<T, Container>& x, const queue<T, Container>& y);
template<class T, class Container>
constexpr bool operator!=(const queue<T, Container>& x, const queue<T, Container>& y);
template<class T, class Container>
constexpr bool operator<(const queue<T, Container>& x, const queue<T, Container>& y);
template<class T, class Container>
constexpr bool operator>(const queue<T, Container>& x, const queue<T, Container>& y);
template<class T, class Container>
constexpr bool operator<=(const queue<T, Container>& x, const queue<T, Container>& y);
template<class T, class Container>
constexpr bool operator>=(const queue<T, Container>& x, const queue<T, Container>& y);
template<class T, three_way_comparable Container>
constexpr compare_three_way_result_t<Container> operator<=>(
const queue<T, Container>& x, const queue<T, Container>& y);
template<class T, class Container>
constexpr void swap(queue<T, Container>& x,
queue<T, Container>& y) noexcept(noexcept(x.swap(y)));
template<class T, class Container, class Alloc>
struct uses_allocator<queue<T, Container>, Alloc>;
// formatter specialization for queue
template<class CharT, class T, formattable<CharT> Container>
struct formatter<queue<T, Container>, CharT>;
template<class T, class Container>
constexpr bool enable_nonlocking_formatter_optimization<queue<T, Container>> = false;
// class template priority_queue
template<class T,
class Container = vector<T>,
class Compare = less<typename Container::value_type>>
class priority_queue;
template<class T, class Container, class Compare>
constexpr void swap(
priority_queue<T, Container, Compare>& x,
priority_queue<T, Container, Compare>& y) noexcept(noexcept(x.swap(y)));
template<class T, class Container, class Compare, class Alloc>
struct uses_allocator<priority_queue<T, Container, Compare>, Alloc>;
// formatter specialization for priority_queue
template<class CharT, class T, formattable<CharT> Container, class Compare>
struct formatter<priority_queue<T, Container, Compare>, CharT>;
template<class T, class Container, class Compare>
constexpr bool
enable_nonlocking_formatter_optimization<priority_queue<T, Container, Compare>> =
false;
}
Class template std::queue
namespace std {
template<class T, class Container = deque<T>> class queue
{
public:
using value_type = Container::value_type;
using reference = Container::reference;
using const_reference = Container::const_reference;
using size_type = Container::size_type;
using container_type = Container;
protected:
Container c;
public:
constexpr queue()
: queue(Container())
{
}
constexpr explicit queue(const Container&);
constexpr explicit queue(Container&&);
template<class InputIter> constexpr queue(InputIter first, InputIter last);
template<container-compatible-range<T> R> constexpr queue(from_range_t, R&& rg);
template<class Alloc> constexpr explicit queue(const Alloc&);
template<class Alloc> constexpr queue(const Container&, const Alloc&);
template<class Alloc> constexpr queue(Container&&, const Alloc&);
template<class Alloc> constexpr queue(const queue&, const Alloc&);
template<class Alloc> constexpr queue(queue&&, const Alloc&);
template<class InputIter, class Alloc>
constexpr queue(InputIter first, InputIter last, const Alloc&);
template<container-compatible-range<T> R, class Alloc>
constexpr queue(from_range_t, R&& rg, const Alloc&);
constexpr bool empty() const { return c.empty(); }
constexpr size_type size() const { return c.size(); }
constexpr reference front() { return c.front(); }
constexpr const_reference front() const { return c.front(); }
constexpr reference back() { return c.back(); }
constexpr const_reference back() const { return c.back(); }
constexpr void push(const value_type& x) { c.push_back(x); }
constexpr void push(value_type&& x) { c.push_back(std::move(x)); }
template<container-compatible-range<T> R> constexpr void push_range(R&& rg);
template<class... Args> constexpr decltype(auto) emplace(Args&&... args)
{
return c.emplace_back(std::forward<Args>(args)...);
}
constexpr void pop() { c.pop_front(); }
constexpr void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
{
using std::swap;
swap(c, q.c);
}
};
template<class Container>
queue(Container) -> queue<typename Container::value_type, Container>;
template<class InputIter>
queue(InputIter, InputIter) -> queue</*iter-value-type*/<InputIter>>;
template<ranges::input_range R>
queue(from_range_t, R&&) -> queue<ranges::range_value_t<R>>;
template<class Container, class Allocator>
queue(Container, Allocator) -> queue<typename Container::value_type, Container>;
template<class InputIter, class Allocator>
queue(InputIter, InputIter, Allocator)
-> queue</*iter-value-type*/<InputIter>,
deque</*iter-value-type*/<InputIter>, Allocator>>;
template<ranges::input_range R, class Allocator>
queue(from_range_t, R&&, Allocator)
-> queue<ranges::range_value_t<R>, deque<ranges::range_value_t<R>, Allocator>>;
template<class T, class Container, class Alloc>
struct uses_allocator<queue<T, Container>, Alloc>
: uses_allocator<Container, Alloc>::type
{};
}
Class template std::priority_queue
namespace std {
template<class T,
class Container = vector<T>,
class Compare = less<typename Container::value_type>>
class priority_queue
{
public:
using value_type = Container::value_type;
using reference = Container::reference;
using const_reference = Container::const_reference;
using size_type = Container::size_type;
using container_type = Container;
using value_compare = Compare;
protected:
Container c;
Compare comp;
public:
constexpr priority_queue()
: priority_queue(Compare())
{
}
constexpr explicit priority_queue(const Compare& x)
: priority_queue(x, Container())
{
}
constexpr priority_queue(const Compare& x, const Container&);
constexpr priority_queue(const Compare& x, Container&&);
template<class InputIter>
constexpr priority_queue(InputIter first,
InputIter last,
const Compare& x = Compare());
template<class InputIter>
constexpr priority_queue(InputIter first,
InputIter last,
const Compare& x,
const Container&);
template<class InputIter>
constexpr priority_queue(InputIter first,
InputIter last,
const Compare& x,
Container&&);
template<container-compatible-range<T> R>
constexpr priority_queue(from_range_t, R&& rg, const Compare& x = Compare());
template<class Alloc> constexpr explicit priority_queue(const Alloc&);
template<class Alloc> constexpr priority_queue(const Compare&, const Alloc&);
template<class Alloc>
constexpr priority_queue(const Compare&, const Container&, const Alloc&);
template<class Alloc>
constexpr priority_queue(const Compare&, Container&&, const Alloc&);
template<class Alloc> constexpr priority_queue(const priority_queue&, const Alloc&);
template<class Alloc> constexpr priority_queue(priority_queue&&, const Alloc&);
template<class InputIter, class Alloc>
constexpr priority_queue(InputIter, InputIter, const Alloc&);
template<class InputIter, class Alloc>
constexpr priority_queue(InputIter, InputIter, const Compare&, const Alloc&);
template<class InputIter, class Alloc>
constexpr priority_queue(
InputIter, InputIter, const Compare&, const Container&, const Alloc&);
template<class InputIter, class Alloc>
constexpr priority_queue(
InputIter, InputIter, const Compare&, Container&&, const Alloc&);
template<container-compatible-range<T> R, class Alloc>
constexpr priority_queue(from_range_t, R&& rg, const Compare&, const Alloc&);
template<container-compatible-range<T> R, class Alloc>
constexpr priority_queue(from_range_t, R&& rg, const Alloc&);
constexpr bool empty() const { return c.empty(); }
constexpr size_type size() const { return c.size(); }
constexpr const_reference top() const { return c.front(); }
constexpr void push(const value_type& x);
constexpr void push(value_type&& x);
template<container-compatible-range<T> R> constexpr void push_range(R&& rg);
template<class... Args> constexpr void emplace(Args&&... args);
constexpr void pop();
constexpr void swap(priority_queue& q) noexcept(
is_nothrow_swappable_v<Container>&& is_nothrow_swappable_v<Compare>)
{
using std::swap;
swap(c, q.c);
swap(comp, q.comp);
}
};
template<class Compare, class Container>
priority_queue(Compare, Container)
-> priority_queue<typename Container::value_type, Container, Compare>;
template<class InputIter,
class Compare = less</*iter-value-type*/<InputIter>>,
class Container = vector</*iter-value-type*/<InputIter>>>
priority_queue(InputIter, InputIter, Compare = Compare(), Container = Container())
-> priority_queue</*iter-value-type*/<InputIter>, Container, Compare>;
template<ranges::input_range R, class Compare = less<ranges::range_value_t<R>>>
priority_queue(from_range_t, R&&, Compare = Compare())
-> priority_queue<ranges::range_value_t<R>,
vector<ranges::range_value_t<R>>,
Compare>;
template<class Compare, class Container, class Allocator>
priority_queue(Compare, Container, Allocator)
-> priority_queue<typename Container::value_type, Container, Compare>;
template<class InputIter, class Allocator>
priority_queue(InputIter, InputIter, Allocator)
-> priority_queue</*iter-value-type*/<InputIter>,
vector</*iter-value-type*/<InputIter>, Allocator>,
less</*iter-value-type*/<InputIter>>>;
template<class InputIter, class Compare, class Allocator>
priority_queue(InputIter, InputIter, Compare, Allocator)
-> priority_queue</*iter-value-type*/<InputIter>,
vector</*iter-value-type*/<InputIter>, Allocator>,
Compare>;
template<class InputIter, class Compare, class Container, class Allocator>
priority_queue(InputIter, InputIter, Compare, Container, Allocator)
-> priority_queue<typename Container::value_type, Container, Compare>;
template<ranges::input_range R, class Compare, class Allocator>
priority_queue(from_range_t, R&&, Compare, Allocator)
-> priority_queue<ranges::range_value_t<R>,
vector<ranges::range_value_t<R>, Allocator>,
Compare>;
template<ranges::input_range R, class Allocator>
priority_queue(from_range_t, R&&, Allocator)
-> priority_queue<ranges::range_value_t<R>,
vector<ranges::range_value_t<R>, Allocator>>;
// no equality is provided
template<class T, class Container, class Compare, class Alloc>
struct uses_allocator<priority_queue<T, Container, Compare>, Alloc>
: uses_allocator<Container, Alloc>::type
{};
}