class priority_queue<> 简单介绍

2020-10-10 16:38:52 浏览数 (1)

今日发现要使用堆,然后priority_queue 使用的恰好是堆,默认是大根堆,这样的话,如果遇到需要用到大根堆,小根堆来处理问题的时候,可以使用这个结构。

常用方法与队列差不 push(),pop(),top()

上一部分代码,可以看出默认比较是 less 所以是大根堆,默认的话,里面的容器是vector

代码语言:javascript复制
template<class _Ty,
    class _Container = vector<_Ty>,
    class _Pr = less<typename _Container::value_type> >
    class priority_queue
    {    // priority queue implemented with a _Container
public:
    typedef priority_queue<_Ty, _Container, _Pr> _Myt;
    typedef _Container container_type;
    typedef typename _Container::value_type value_type;

    protected:
    _Container c;    // the underlying container
    _Pr comp;    // the comparator functor

    priority_queue(const _Pr& _Pred, const _Container& _Cont)
        : c(_Cont), comp(_Pred)
        {    // construct by copying specified container, comparator
        make_heap(c.begin(), c.end(), comp);
        }

    void push(value_type&& _Val)
        {    // insert element at beginning
        c.push_back(_STD move(_Val));
        push_heap(c.begin(), c.end(), comp);
        }

    bool empty() const
        {    // test if queue is empty
        return (c.empty());
        }

    size_type size() const
        {    // return length of queue
        return (c.size());
        }

    const_reference top() const
        {    // return highest-priority element
        return (c.front());
        }

    void push(const value_type& _Val)
        {    // insert value in priority order
        c.push_back(_Val);
        push_heap(c.begin(), c.end(), comp);
        }

    void pop()
        {    // erase highest-priority element
        pop_heap(c.begin(), c.end(), comp);
        c.pop_back();
        }

    void swap(_Myt& _Right)
        {    // exchange contents with _Right
        _Swap_adl(c, _Right.c);
        _Swap_adl(comp, _Right.comp);
        }
    };

0 人点赞