• [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

  • 相关阅读:
    BZOJ 3709: [PA2014]Bohater
    BZOJ 3689: 异或之
    BZOJ 4385: [POI2015]Wilcze doły
    2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017) Solution
    Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3) Solution
    BZOJ 4320: ShangHai2006 Homework
    BZOJ 4318: OSU!
    2016-2017 ACM-ICPC CHINA-Final Solution
    BZOJ 5312: 冒险
    Codeforces Round #520 (Div. 2) Solution
  • 原文地址:https://www.cnblogs.com/fariver/p/7250507.html
Copyright © 2020-2023  润新知