| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | #ifndef __GBLIBCPP_QUEUE__#define __GBLIBCPP_QUEUE__#include <vector>#include <functional>#include <memory>#include <algorithm>#include <initializer_list>#include <cstddef>namespace std {template <typename T,    typename Container = std::vector<T>,    typename Compare = std::less<typename Container::value_type>>class priority_queue {public:    using container_type = Container;    using value_compare = Compare;    using value_type = typename Container::value_type;    using size_type = typename Container::size_type;    using reference = typename Container::reference;    using const_reference = typename Container::const_reference;    using allocator_type = typename Container::allocator_type;protected:    container_type c;    value_compare comp;public:    __GBLIBCPP_CONSTEXPR    priority_queue(const Compare& comp, const Container& c)        : c(c), comp(comp)    {        std::make_heap(c.begin(), c.end(), comp);    }    __GBLIBCPP_CONSTEXPR    explicit priority_queue(const Compare& comp, Container&& c)        : c(std::move(c)), comp(comp)    {        std::make_heap(c.begin(), c.end(), comp);    }    __GBLIBCPP_CONSTEXPR    priority_queue() : priority_queue(Compare(), Container()) {}    __GBLIBCPP_CONSTEXPR    explicit priority_queue(const Compare& comp)        : priority_queue(comp, Container()) {}        template <typename InputIter>    __GBLIBCPP_CONSTEXPR    priority_queue(InputIter first, InputIter last,        const Compare& comp = Compare())        : c(first, last), comp(comp)    {        std::make_heap(c.begin(), c.end(), comp);    }    template <typename InputIter>    __GBLIBCPP_CONSTEXPR    priority_queue(InputIter first, InputIter last,        const Compare& comp, const Container& c)        : c(c), comp(comp)    {        c.insert(c.end(), first, last);        std::make_heap(c.begin(), c.end(), comp);    }    template <typename InputIter>    __GBLIBCPP_CONSTEXPR    priority_queue(InputIter first, InputIter last,        const Compare& comp, Container&& c)        : c(std::move(c)), comp(comp)    {        c.insert(c.end(), first, last);        std::make_heap(c.begin(), c.end(), comp);    }    __GBLIBCPP_CONSTEXPR    priority_queue(const priority_queue&) = default;    __GBLIBCPP_CONSTEXPR    priority_queue(priority_queue&&) = default;    __GBLIBCPP_CONSTEXPR    priority_queue& operator=(const priority_queue&) = default;    __GBLIBCPP_CONSTEXPR    priority_queue& operator=(priority_queue&&) = default;    [[nodiscard]]    __GBLIBCPP_CONSTEXPR    bool empty(void) const noexcept { return c.empty(); }    __GBLIBCPP_CONSTEXPR    size_type size(void) const noexcept { return c.size(); }    __GBLIBCPP_CONSTEXPR    const_reference top(void) const { return c.front(); }    __GBLIBCPP_CONSTEXPR    void push(const value_type& val)    {        c.push_back(val);        std::push_heap(c.begin(), c.end(), comp);    }    __GBLIBCPP_CONSTEXPR    void push(value_type&& val)    {        c.push_back(std::move(val));        std::push_heap(c.begin(), c.end(), comp);    }    template <typename... Args>    __GBLIBCPP_CONSTEXPR    void emplace(Args&&... args)    {        c.emplace_back(std::forward<Args>(args)...);        std::push_heap(c.begin(), c.end(), comp);    }    __GBLIBCPP_CONSTEXPR    void pop(void)    {        std::pop_heap(c.begin(), c.end(), comp);        c.pop_back();    }    __GBLIBCPP_CONSTEXPR    void swap(priority_queue& other) noexcept(        noexcept(std::swap(c, other.c)) &&        noexcept(std::swap(comp, other.comp)))    {        std::swap(c, other.c);        std::swap(comp, other.comp);    }};template <typename Compare, typename Container>priority_queue(Compare, Container)    -> priority_queue<typename Container::value_type,        Container, Compare>;template <typename T, typename Container, typename Compare>void swap(priority_queue<T, Container, Compare>& lhs,    priority_queue<T, Container, Compare>& rhs)    noexcept(noexcept(lhs.swap(rhs))){ lhs.swap(rhs); }} // namespace std#endif
 |