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

[C++]返回最值元素的更多相关文章

  1. 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。

    /** 转换成XML格式字符串 **/ public static String doXMLStr(Map<String, String> map) { StringBuffer xml_ ...

  2. 使用size()方法输出列表中的元素数量。需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变。仅当没有任何线程修改列表时,才能保证返回的结果是准确的。

    使用size()方法输出列表中的元素数量.需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变.仅当没 ...

  3. C++ multimap容器访问同一键值元素的不同方法

    multimap是一种多元map容器,允许一个键对应多个值. 本文介绍了 multimap访问同一键值元素的三种不同方法,详细看下面代码: typedef multimap<string,int ...

  4. SQL server 查询出现:---“子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。”SQL查询错误解析---

    最近用select进行数据筛选,碰到下面的这个错误: ---子查询返回的值不止一个.当子查询跟随在 =.!=.<.<=.>.>= 之后,或子查询用作表达式时,这种情况是不允许的 ...

  5. c指针 --笔记2返回指针值的函数

    返回指针值的函数 一般带回指针值的函数,定义形式为: int *a (int x, int y); 看这个经典案例: #include <stdio.h> int main(int arg ...

  6. “子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。”SQL查询错误解析

    为了实现下述代码,首先得有数据库和相应的表格,本文用的是https://blog.csdn.net/qaz13177_58_/article/details/5575711/中的案例,即先用链接中那些 ...

  7. 【笔记】关于jq $.ajax 函数 success回调函数不能赋正确值或返回正确值的问题

    最近在一个项目里面打算实现如下功能: 当我注册账号的时候当输入账号完毕后输入框失焦时执行一个 ajax 请求,验证账号是否被注册,并未这个输入框的 isCorrect属性赋值,如果没有被注册 isCo ...

  8. Mysql 返回JSON值属性的函数 (五)

    本节中的函数返回JSON值的属性. JSON_DEPTH(json_doc) 返回JSON文档的最大深度.NULL如果参数为,则 返回 NULL.如果参数不是有效的JSON文档,则会发生错误. 一个空 ...

  9. React技巧之组件中返回多个元素

    原文链接:https://bobbyhadz.com/blog/react-return-multiple-elements 作者:Borislav Hadzhiev 正文从这开始~ fragment ...

随机推荐

  1. hibernate的懒加载

    WHY? WHAT? HOW? 所谓懒加载(lazy)就是延时加载,延迟加载.即不是不加载,而是在需要的时候才加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢 ...

  2. strut2以及路径的一些问题

    Struts2一个Action内包含多个请求处理方法的处理,method的使用方法,struts2中 struts2的关于method=“{1}"意思详解 <action   name ...

  3. Rigidbody和Collider

    Rigidbody: 常用属性: Mass:默认为1,单位并不是g或kg,而是相对的质量计量单位,只决定物体的惯性: Drag:空气阻力: Angular Drag:角阻力,旋转时受的阻力: Use ...

  4. Java基础-Collection子接口之Set接口

    Java基础-Collection子接口之Set接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学习Collection接口时,记得Collection中可以存放重复元素,也可 ...

  5. codevs 3369 膜拜(线型)

    3369 膜拜 http://codevs.cn/problem/3369/ 题目描述 Description 神牛有很多…当然…每个同学都有自己衷心膜拜的神牛.某学校有两位神牛,神牛甲和神牛乙.新入 ...

  6. 动态规划:树形DP-景点中心(树的带权重心)

    话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观.镇海中学共有n个景点,每个景点均有若干学生正在参 观.这n个景点以自然数1至n编号,每两个景点的编号均不同 ...

  7. HTTP请求方式及状态码

  8. CSS3实战之resize

    resize属性可以设置是否允许用户缩放网页中元素的大小 总共有4种取值 none vertical horizontal both 举个栗子 <!DOCTYPE html PUBLIC &qu ...

  9. lxml视频讲座

    lxml视频讲座 Winfortune 01 - How to create an equivalent of fortune and cowsay for Windows, using Python ...

  10. 【学习DIV+CSS】1. 你必须知道的三个知识

    1. DIV+CSS的叫法不够严谨 我们以前做页面布局的时候大多是用Table,很多人称之为“Table+CSS”,而现在比较流行的是DIV布局,所以称之为“DIV+CSS”.听起来是挺合理的,岂不知 ...