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. UIScrollview 与 Autolayout 的那点事

    原文  http://www.cocoachina.com/ios/20151221/14757.html 前言 自从写了 介绍Masonry 那篇文章以后 就一直有人对UIScrollView的那个 ...

  2. 主角场景Shader效果:描边

    基本思路:Shader用两个Pass,一个渲染描边部分,一个渲染物体部分. Pass1:剔除正面,渲染背面,把顶点延法线方向外围扩展一定宽度,用来表现描边的粗细,这部分用自己设定的颜色. Pass2: ...

  3. Git7:使用Gitlab管理远程仓库

    目录 1.安装 2.gitlab基本配置 3.gitlab的邮件配置 3.1.使用本地的postfix发送邮件 3.2.使用邮件发送模板 3.3.使用腾讯企业邮箱配置发送邮件 3.4.使用163邮箱来 ...

  4. 「Vue」自定义指令

    #全局自定义指令1.使用Vue.directive()定义全局的指令 v-focus2.参数1 指令的名称,在定义的时候,指令的名称前面不需要加v-前缀3.但是在调用的时候必须在指令名称前 加上v-前 ...

  5. asp.net webapi http请求生命周期

    先附上webapi http生命周期图. 原始的图片地址为:https://www.asp.net/media/4071077/aspnet-web-api-poster.pdf

  6. http协议POST请求头content-type主要的四种取值

    介绍: 在此之前对content-type理解很肤浅,因此必须记录下来现在的理解,以便回顾 Content-Type,从名字上可以理解为内容类型,但在互联网上专业术语叫“媒体类型”,即MediaTyp ...

  7. Jenkins配置定时任务

    在任务配置中,滚动到构建触发器-->勾选"Build periodically"-->在输入框中配置触发时间 以上配置,表示在6月13日23点触发. 如果配置成  00 ...

  8. Redis实战(一)CentOS 7上搭建redis-3.0.2

    1.安装redis wget http://download.redis.io/releases/redis-3.0.2.tar.gz tar zxvf redis-3.0.2.tar.gz cd   ...

  9. mysql的force index

    MSQL中使用order by 有个坑,会默认走order by 后面的索引.而不走where条件里应该走的索引.大家在使用时要绕过此坑. 如下语句因为order by 走了settle_id这个主键 ...

  10. 20155303 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155303 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 步骤一(新建文件夹): ...