[C++]返回最值元素

1 priority_queue

C++中优先队列是一种特殊的队列,能够返回队列中优先级最大或者最小的元素,其内部是由实现的,个人认为这种方式使用更加直观。

1.1 返回vector中的最值元素

#include <queue>
vector<int> vec({3, 5, 1, 10});
priority_queue<int> heap(vec.begin(), vec.end());    //注意,我们可以用vector容器来初始化priority_queue,而queue确不可以
while (!heap.empty()) {        //使用top(), push(val), pop()  来访问,增,删 元素
    cout<<heap.top()<<" ";
    heap.pop();
}

输出结果为

10 5 3 1

也就是说,默认为一个最大堆,所以也可以等效为,如下定义,即值越小的元素优先级越低。

priority_queue<int, vector<int>, less<int>> heap(vec.begin(), vec.end());

但是,有时候我们想让在内部建立一个小项堆,使用值越小的元素优先级越高,这时就可以用如下定义,

priority_queue<int, vector<int>, greater<int>> heap(vec.begin(), vec.end());

1.2自定义比较器

待补充。。。

2 红黑树系列容器

除了堆可以实现返回最值元素,红黑树系列也可返回最值元素,代表容器有set, multiset, map
并且set的使用方式与priority_queue的有些不同,以下用set为代表说明其使用方式:

#include <set>    //如果使用multiset,也是include <set>
vector<int> vec({3, 5, 1, 10});
set<int> myset(vec.begin(), vec.end());
while (!myset.empty()) {
    auto top_it = myset.begin();    //使用迭代器访问元素
    cout<<*top_it<<" ";
    myset.erase(top_it);        //使用erase删除元素,使用insert添加元素
}

输出为:

1 3 5 10

这说明priority_queue默认为降序,而set从begin()到end()元素默认升序排列。说明

set<int> myset(vec.begin(), vec.end());

==

set<int, less<int>> myset(vec.begin(), vec.end());

以上两种初始方式相同,但都为升序,如果想降序,使用如下方式定义

set<int, greater<int>> myset(vec.begin(), vec.end());

make_heap

reference

原文地址:https://www.cnblogs.com/fariver/p/7250507.html