[C++]返回最值元素


1 priority_queue

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

1.1 返回vector中的最值元素

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

输出结果为

10 5 3 1

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

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

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

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

1.2自定义比较器

待补充。。。

2 红黑树系列容器

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

#include     //如果使用multiset,也是include 
vector vec({3, 5, 1, 10});
set 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 myset(vec.begin(), vec.end());

==

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

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

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

make_heap

reference