deque,list,queue,priority_queue】的更多相关文章

1.deque deque双端队列容器与vector一样,采用线性表顺序存储结构,但与vector唯一不同的是,deque采用分块的线性存储结构来存 储数据,每块的大小一般为512字节,称为一个deque块,所有的deque使用一个map块进行管理,每个map数据项记录各个 deque块的首地址,这样一来,deque块在头部和尾部都可以插入和删除元素,而不需要移动其它元素,在尾部插入元素使用 push_back(),在头部插入使用push_front(),在中间插入使用insert(),但是在中…
stack, deque 和 queue这三个c++的STL的数据结构很类似但又各有不同. stack是堆栈,没有迭代器,特点是后进先出.用push()将元素压入栈中,top()返回栈顶元素,pop()移除栈顶元素. deque是双端队列,支持迭代器,使用push_back()在队尾添加元素,pop_back()移除队尾元素,这些跟vector差不多.不同的地方在于deque还可在队首添加和移除元素,使用pop_front()和push_front(). queue是队列,特点是先进先出,不支持…
之所以把这三个容器放在一起,是因为他们都是容器适配器.   STL中queue就是我们常用的FIFO队列,实现是一个容器适配器,这种数据结构在网络中经常使用.   queue的模板声明: template < class T, class Container = deque< T> > class queue; 这里第二个参数不再是一个内存分配器,而是一个容器,也就是这里我们可以传递一个deque<T>, list<T>, vector<T>等容…
顺序容器的种类有:vector,list.deque 顺序容器适配器: stack     //先进后出   栈 queue   //先进先出   队列 priority_queue   //也优先管理级的优先队列 1.头文件 #include <vector> #include <list> #include <deque> //每一种头文件对应一种顺序容器 #include <queue> //队列 优先队列的头文件 #include <stack…
题意:给你n个操做,判断是那种数据结构. #include<iostream> #include<cstdio> #include<cstdlib> #include<stack> #include<queue> using namespace std; int n; ],u[]; int ck_q() { //cout<<"!!"<<endl; queue<int>s; ; i<n;…
首先deque和vector是很像的 但是de代表double双向的队列那么deque可以从首部添加(删除)元素也可以从尾部添加(删除)元素. .push_back(elem) .push_front(elem) .pop_back() .pop_front() deque的赋值: 对于deque的大小.插入.删除和vector基本一致. queue是一种队列容器“先进先出”,queue是装饰deque而成为的另一种容器 .push(elem)//从队尾添加元素 .pop()//删除队头第一个元…
概述 接口,一个线性结合,支持在集合首尾add , remove , deque 是double  ended queue 的缩写,意味双端队列,接口提供的方法有两种类型,如果失败,一种抛出异常,一种返回特殊值(null, false)   第一个元素(头部) 最后一个元素(尾部)   抛出异常 特殊值 抛出异常 特殊值 插入 addFirst(e) offerFirst(e) addLast(e) offerLast(e) 移除 removeFirst() pollFirst() remove…
本节主要总结标准库Deque的设计方法和特性以及相关迭代器内部特征 1.Deque基本结构 Deque(双向队列)也号称连续空间(其实是给使用者一个善意的谎言,只是为了好用),其实它使用分段拼接起来的(分段连续),各个分段间是用Vector来管理的,Vector的每个元素就是一个指针,每个指针指向一个分段,每一个分段就是一个缓冲区buffer,首位安插元素时,当缓冲区满了需要扩充时,就重新分配一个缓冲区然后串在Vector里面: Deque的迭代器有4个指针,其中node表示在控制中心的位置(也…
deque如何模拟连续空间?通过源码可以看到这个模型就是通过迭代器来完成. 迭代器通过重载操作符+,-,++,--,*和->来实现deque连续的假象,如上图中的 finish-start ,它通过下图中重载-号来实现迭代器的相减,返回deque的大小. 用finish迭代器上的node相减(node为控制中心的下标序号)再减1,求得两个首尾两端之间完整buff个数,乘以buff大小,在加上两端非完整buff中元素个数就得到了deque的大小. 再例如对迭代器取*,通过重载函数可以看到它返回了指…
deque是可双端扩展的双端队列,蓝色部分就是它的迭代器类,拥有四个指针,第一个cur用来指向当前元素,first指向当前buffer头部,last指向当前buffer尾部,node指向map自己当前buffer在map中的位置. map叫做控制中心,它是由vector来实现的,所以它也拥有扩容功能,buffer的大小一般固定,当迭代器跳转到某个buff两端并继续往两端移动时,node就会跳转,即迭代器便指向另一个buffer,如果deque在自增元素,则当前buff不足时,deque会申请bu…
  list vector deque stack queue priority_queue set [unordered_set] map [unordered_map] multimap [unordered_multimap]     contiguous storage double-ended queue LIFO FIFO 1st is greatest       Iterators       X X X       Element access push_back push_b…
STL中11个容器类型分别是deque,list,queue,priority_queue,stack,vector,map,multimap,set,multiset,bieset(在比特级处理数据的容器,不讨论) 一些基本的容器特征 表达式 返回值 说明 复杂度 XX:iterator 对应迭代器 指针 编译时间 X u   创建一个名为u的空容器 固定 X u(a) /X u=a   复制a到u 线性 a.begin() 迭代器 指向容器的第一个元素 固定 a.end() 迭代器 指向超尾…
STL是一种泛型编程(generic programming).面向对象编程关注的是编成的数据方面,而泛型编程关注的是算法.它们之间的共同点是抽象和创建可重用代码,单他们的理念决然不同.泛型编程旨在编写独立于数据类型的代码. 16.4.1 为何使用迭代器理解迭代器是理解STL的关键所在.模板使得算法独立于存储的数据类型,而迭代其使算法独立于使用的容器类型.因此,它们都是STL通用方法的重要组成部分.为了解为何需要迭代器,我们来看如何为两种不同数据表现实现find函数,然后来看如何推广这种方法.首…
[1] string基础 [1.1] string 的构造 #include <iostream> #include <string> int main() { using namespace std; cout << "1 --- string(const char* s):将string对象初始化为s指向的C风格字符串" << endl; string one("benxintuzi_1"); cout <&…
网上题解比较少,自己比较弱研究了半天(已经过了),希望对找题解的人有帮助 题目链接:https://codeforc.es/contest/1201/problem/D 题意: 给你一个矩形,起始点在(1,1),在给定坐标有宝物,你要将整个图中的宝物全部拿到,而且你不能向下走(左右随意),而且只有在所给出的列上你才能向上走,问最少要走多少格 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//spri…
题意:https://ac.nowcoder.com/acm/contest/2995/E 给你一棵树,节点有权值,让你求所有路径max-min的和. 思路: 我们计算每个点的贡献,对于一个点,当它为某条路径的最大值是,一定在一个所有值<=它的连通块里.所有我们从小到大添边合并共享(两块的大小之积,不是和) 最小值也同样处理. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf…
题意:https://www.luogu.com.cn/problem/P3195 思路:https://www.luogu.com.cn/problemnew/solution/P3195 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//malloc exit strcat itoa system…
题意:http://acm.hdu.edu.cn/showproblem.php?pid=1401 给你8*8的棋盘和4个棋子初始位置.最终位置,问你能否在8次操作后达到该状态. 思路: 双向BFS,起点开始正搜4步,终点倒搜4步,map标记. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//mal…
这才是更一般的二分写法--HDU5412 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//malloc exit strcat itoa system("cls") #include <iostream>//pair #include <fstream>/…
#define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//malloc exit strcat itoa system("cls") #include <iostream>//pair #include <fstream>//freopen("C:\\Us…
题意:https://ac.nowcoder.com/acm/contest/882/E 给你01矩阵,有两种操作:1是把一个位置0变1.1变0,2是问你从第一行i开始,到最后一行j有几种走法.你只能不能向上走而且不能往回走. 思路: 01矩阵里每一行可以用一个矩阵表示向下有几种走法,i行到j行的的走法就是各行的矩阵的乘积.用线段树维护即可. 线段树seg[1]的[x][y]就是答案. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #…
题意:https://codeforces.com/group/ikIh7rsWAl/contest/259944/problem/D 给你q个操作,4个数n,a,k,c,从n好位置开始每次加a的位置变成字符c,加到k次停止. 思路: 首先肯定是从下往上修改,改完就可以不再考虑该位置了. 1.对于a公差大于根号n的我们直接更新. 2.对于a公差小于根号n的,我们存根号n个数组,长度为n,对每个a公差分别用并查集维护下一个要的数,每个数最多使用一次. #define IOS ios_base::s…
题意: 有n个数,每个数都有价钱,连续的取可以获得len*len的利益,使利益最大. 思路: 三维DP,1.2.3维分别是第i个,剩余多少钱,从后往前连续的有几个. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//malloc exit strcat itoa system("cls&qu…
题意:http://acm.hdu.edu.cn/showproblem.php?pid=2594 如题. 思路: Next数组记录的是pos位置失配时要跑到哪里,所以最后得再添加一个字符‘#’. 连结两个串的中间加一些奇怪字符以保证next值不在同一个串中. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib&…
题意:http://acm.hdu.edu.cn/showproblem.php?pid=2242 给你一个图,问你缩完点树上割边的做小绝对值差. 思路: 这题核算起来整整做了我一天(即24个小时)!!!一开始是MLE了近20发,然后TLE5.6发,再WA了一个晚上加一个下午. 有一种自闭是你突然对任何事物都失去追求:期中考?0分算了,这题再错我不学了还不行吗. 再加上HDU的评测机本来就很迷,该RE的判MLE,我N开1还MLE.服了嗷 ! 算法里要注意的就是:Tarjan里因为你补了一条反向边…
题意:http://acm.hdu.edu.cn/showproblem.php?pid=2458 问你二分图的最大团是多大. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//malloc exit strcat itoa system("cls") #include <i…
题意:http://acm.hdu.edu.cn/showproblem.php?pid=1540 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//malloc exit strcat itoa system("cls") #include <iostream>//p…
#define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//malloc exit strcat itoa system("cls") #include <iostream>//pair #include <fstream>//freopen("C:\\Us…
#define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupper #include <cstdlib>//malloc exit strcat itoa system("cls") #include <iostream>//pair #include <fstream>//freopen("C:\\Us…
题意:http://codeforces.com/gym/102394/problem/E 1操作是给你一串数,2操作是连结两个串(所以可能很长),问你最后一个串的值(知道最多的个数就很好算,关键计算个数) 思路: 对二操作建图,一开始还以为建出来的是树就可以直接BFS计算次数,自闭了好久,最后才发现是拓扑图,一点点扒点才行. 离散化加统计个数啥的导致代码冗长,奇奇怪怪的数组贼多. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #in…