文章目录

  • 1.容器适配器
  • 2.stack
  • 3.queue
  • 4.优先级队列priority_queue
  • 5.make_heap
  • 6.set

1.容器适配器

  • 利用基本容器构造的容器,称之为容器适配器
  • 基本容器
    序列式容器:vector,deque,list
    关联式容器:set,multiset,map,multimap
  • 容器适配器
    stack;
    queue;
    priority_queue

2.stack

  • eg:P85\01.cpp
#include <iostream>
#include <vector>
#include <list>
#include <stack>using  namespace std;int main( void)
{// stack<int> s;//栈是后进先出,使用向量来实现// stack< int, vector< int> > s;//可以用list链表来实现//只要这些容器有push_back,pop_back就行stack< int, list< int> > s;for ( int i =  0; i <  5; i++){s.push(i);}//s.size()是无符号的//for (size_t i=0; i<s.size(); i++)//{//  cout<<s.top()<<' ';   Error:size()一直在变化,每当pop一个元素,size()的值就变小了//  s.pop();//}while (!s.empty()){cout << s.top() <<  ' ';s.pop();}cout << endl;return  0;
}
  • 测试:

利用双端队列来实现的,_Container就是一个向量

3.queue

  • eg:P85\02.cpp
#include <iostream>
#include <vector>
#include <list>
#include <stack>
#include <queue>using  namespace std;int main( void)
{//int a[] = {1, 2, 3, 4, 5};//vector<int> v(a, a+5);//初始化5个元素,list也可以这么用//queue<int> v(a, a+5);//error,queue的构造函数要么一个参数,要么0个参数,没有2个参数,stack一样//队列是先进先出queue< int> q;//默认采用deque,接口有pop_front()方法,容器能够从头部弹出// queue< int, list< int> > q;//good,接口有pop_front()方法,容器能够从头部弹出// queue< int, vector< int> > q;//error,没有pop_front()方法for ( int i =  0; i <  5; i++){q.push(i);}while (!q.empty()){//打印队头元素cout << q.front() <<  ' ';q.pop();}cout << endl;return  0;
}
  • 测试:

queue的构造函数要么一个参数,要么0个参数

queue默认使用双端队列deque来实现

4.优先级队列priority_queue

  • 不一定先进先出,不一定后进先出

  • eg:P85\03.cpp

#include <iostream>
#include <functional>
#include <vector>
#include <list>
#include <stack>
#include <queue>using  namespace std;int main( void)
{int a[] = { 5,  1,  2,  4,  3};priority_queue<int> a(a, a+5);//greater是函数对象,从小到大,值越小,优先级越大// priority_queue< int, vector< int>, greater< int> > q(a, a +  5);while (!q.empty()){//默认是按照从大到小弹出的,值越大,优先级越大cout << q.top() <<  ' ';//先把第一个元素输出q.pop();//再弹出}cout << endl;return  0;
}
  • 测试:

    less是函数对象,值越大,优先级越高;
    默认采用vector来实现


    调用make_heap算法,构造一个二叉堆。
    即优先级队列的数据内部是以堆的形式来保存的。

5.make_heap

  • eg:P85\04.cpp
#include <iostream>
#include <functional>
#include <vector>
#include <list>
#include <stack>
#include <queue>using  namespace std;int main( void)
{int a[] = { 5,  1,  2,  4,  3};//默认构建的是一个最大堆//二叉堆是一颗完全二叉树,用数组来保存,堆数量不一定纵是二叉树,但是二叉树应用最广//最大堆:父亲比他的任意孩子都要大//最小堆:父亲比他的任意孩子都要小make_heap(a, a +  5);//默认是大堆// make_heap(a, a +  5, less< int>());大堆// make_heap(a, a +  5, greater< int>());小堆//从数组输出到输出流迭代器copy(a, a +  5, ostream_iterator< int>(cout,  " "));cout << endl;return  0;
}
  • 测试:

  • 大堆

  • 小堆

    默认less是大堆

  • 断点:看下sort的排序算法用哪个

    sort(a, a +  5);

  • eg:P85\05.cpp
#include <iostream>
#include <functional>
#include <vector>
#include <list>
#include <stack>
#include <queue>using  namespace std;int main( void)
{int a[] = { 5,  1,  2,  4,  3};//默认构建的是一个最大堆//二叉堆是一颗完全二叉树,用数组来保存,堆数量不一定纵是二叉树,但是二叉树应用最广//最大堆:父亲比他的任意孩子都要大//最小堆:父亲比他的任意孩子都要小// make_heap(a, a +  5);//默认是大堆make_heap(a, a +  5, less< int>());//大堆// make_heap(a, a +  5, greater< int>());小堆//从数组输出到输出流迭代器copy(a, a +  5, ostream_iterator< int>(cout,  " "));cout << endl;// sort(a, a +  5);//堆排序首先要构造成堆,才能排序//这里已经构造了堆了,可以用堆排序//什么样的堆,就决定他用什么样子的排序//less大堆得用less大堆排序//sort_heap不带参数默认是大堆sort_heap(a, a+5, less<int>());copy(a, a +  5, ostream_iterator< int>(cout,  " "));cout << endl;return  0;
}
  • 测试:

6.set

  • eg:P85\06.cpp
#include <iostream>
#include <functional>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <set>using  namespace std;int main( void)
{//默认从小到大排列//与map区别是:key只有1个,按照key来进行映射的,存储在关键码上面// set<int> s;set<int, greater<in> > s;//降序排列s.insert(3);s.insert(1);s.insert(2);s.insert(3);for(set<int,greater<in> >::const_iterator it=s.begin(); it!=s.end();++it)// for(set<int>::const_iterator it=s.begin(); it!=s.end();++it){cout<<*it<<' ';}cout<<endl;return 0;}
  • 测试:

  • eg:P85\07.cpp

#include <iostream>
#include <functional>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <set>using  namespace std;int main( void)
{//multiset允许关键码冲突multiset<int, greater<in> > s;//降序排列s.insert(3);s.insert(1);s.insert(2);s.insert(3);for(multiset<int,greater<in> >::const_iterator it=s.begin(); it!=s.end();++it)// for(set<int>::const_iterator it=s.begin(); it!=s.end();++it){cout<<*it<<' ';}cout<<endl;return 0;}
  • 测试:
  • eg:易犯的错误,P85\08.cpp
#include <iostream>
#include <functional>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <set>using  namespace std;int main( void)
{int a[]={3, 1, 2, 3, 4};vector<int> v(a, a+5);//把值=3的元素删除//error,it已经删除,何来++it呢?运行会报错//第一个遇到的元素是3,it指针指向他,删除他,导致it成为空悬指针,在对其++会出错,因为//他指向的元素都不在了// for(vector<int>::iterator it =v.begin(); it !=v.end();++it)// {//     if(*it == 3)//         v.erase(it);////     else//         cout<<*it<<' ';// }// cout<<endl;//改进如下:for(vector<int>::iterator it =v.begin(); it !=v.end();){if(*it == 3)it = v.erase(it);//返回的it是3的指向下一个元素,下一个it指向1else{cout<<*it<<' ';++it;}}cout<<endl; return 0;
}
  • 测试:

  • 参考:从零开始学C++之STL(十一):容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例

(P85)stl(十三):容器适配器,stack,queue,优先级队列priority_queue,make_heap相关推荐

  1. 6-5-3:STL之stack和queue——优先级队列-priority_queue(堆)的基本使用和模拟实现以及仿函数

    文章目录 一:优先级队列-priority_queue(堆) (1)基本使用 (2)模拟实现 二:仿函数 (1)仿函数是什么 (2)使用仿函数完成大顶堆和小顶堆的构建 一:优先级队列-priority ...

  2. 【C++】优先级队列priority_queue/仿函数(函数对象)

    这里写目录标题 一.优先级队列 1.优先级队列的介绍 2.priority_queue的定义与使用 二.仿函数/函数对象 三.优先级队列的模拟实现 一.优先级队列 1.优先级队列的介绍 1)注意优先级 ...

  3. C++ STL : 模拟实现STL中的容器适配器stack和queue

    目录 什么是容器适配器 stack stack的文档介绍-(来自cplusplus) stack的实现 queue queue的文档介绍-(来自cplusplus) queue的实现 什么是容器适配器 ...

  4. STL学习系列七:优先级队列priority_queue容器

    1.简介 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用,请对stl的类库,多做扩展性学习 这里给个例子: #include< ...

  5. C++ STL 学习笔记__(6)优先级队列priority_queue基本操作

    10.2.7优先级队列priority_queue v  最大值优先级队列.最小值优先级队列 v  优先级队列适配器 STL priority_queue v  用来开发一些特殊的应用,请对stl的类 ...

  6. 【C++】优先级队列priority_queue仿函数

    这里先简单介绍一下优先级队列priority_queue:优先队列是一种容器适配器,默认的情况下,如果没有为特定的priority_queue类实例化指容器类,则使用vector (deque 也是可 ...

  7. 优先级队列priority_queue

    优先级队列priority_queue 优先级队列是一个拥有权值的queue,其内部元素按照元素的权值排列.权值较高者排在最前优先出队.其中缺省情况下系统是通过一个max-heap以堆实现完成排序特性 ...

  8. C++知识点25——使用C++标准库(容器适配器stack、queue、priority_queue)

    除了vector,list,deque等常用的容器,还有根据这些常用的容器进行改造来满足特殊要求的容器,这些特殊容器的行为和常用容器很相近,也称为容器适配器. 常用的容器适配器有三个,分别是stack ...

  9. C++ 容器适配器(stack、queue、priority_queue)

    容器适配器 首先,我们要明白适配器是干什么的?其实就是一个接口转换装置,是得我们能用特定的方法去操作一些我们本来无法操作的东西.举一个例子,比如你的一个设备支持串口线,而你的电脑支持的是usb口,这时 ...

最新文章

  1. Stringtie进行转录本组装和定量
  2. 在pcDuino上使用蓝牙耳机玩转音乐
  3. Win64 驱动内核编程-13.回调监控模块加载
  4. 中国联通与阿里宣布相互开放云计算资源
  5. 对“js变量作用域的疑问”的解答
  6. 百度地图API禁用点击景点弹出详细信息的方法
  7. java随机姓名_Java生成随机姓名、性别和年龄的实现示例
  8. EMMA 覆盖率工具
  9. 【Android Developers Training】 8. 定义Action Bar风格
  10. html 展示 python结果_在HTML中显示Python值
  11. jquery中attr() 和 prop()的区别
  12. Android Studio中竟然还能加入一个程序员鼓励师
  13. FlashXP命令行
  14. 《给QTreeView表项添加右键菜单》:系列教程之四
  15. sql2008服务器运行哪个,SQL SERVER 2008R2 暂用服务器内存直到服务器死机。
  16. 微信小程序getLocation定位偏差问题
  17. command '/Android/Sdk/build-tools/21.1.2/aapt'
  18. 卷积神经网络权重,特征图计算
  19. 云计算 常见问题案例汇总情况
  20. ECSHOP打印订单显示省市区详细地址

热门文章

  1. 堆与栈,深拷贝与浅拷贝的区别
  2. oracle 4535,记一次Oracle Clusterware安装成功后的故障处理
  3. Linux 练习题16.1 磁盘配额
  4. 300年一遇日全食 洋山港观测时间最长
  5. 【美化§守护生命绿xp电脑主题下载§】
  6. 瑞典奶爸“坐月子”很酷,他们的育儿神器连布拉德皮特都在用
  7. CSS学习教程之简单入门
  8. Auto.js学习----engines
  9. php食堂刷卡机系统,刷卡系统,食堂/餐厅刷卡管理系统
  10. SDN入门第一篇——Ubuntu16.04安装mininet-wifi