本文最后更新于:2021年4月16日 晚上
STL容器deque,以及优先级队列 priority_queue。
deque
deque是双向开口的连续线性空间。
deque允许使用常数项时间对两端进行元素的插入和删除操作。
deque没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来
实现原理
deque是一段段定量的连续空间构成的。一旦有必要在deque的前端或者后端增加空间,便会配置一段连续定量的空间,串接在deque的头端或者尾端。
deque采取一块所谓的map(注意,不是STL的map容器)作为主控,这里所谓的map是一小块连续的内存空间,其中每一个元素(此处成为一个结点)都是一个指针,指向另一段连续性内存空间,称作缓冲区。缓冲区才是deque的存储空间的主体。
相关函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| deque<T> deqT; deque(beg, end); deque(n, elem); deque(const deque &deq);
assign(beg, end); assign(n, elem); deque& operator=(const deque &deq); swap(deq);
deque.size(); deque.empty(); deque.resize(num); deque.resize(num, elem);
push_back(elem); push_front(elem); pop_back(); pop_front();
at(idx); operator[]; front(); back();
insert(pos,elem); insert(pos,n,elem); insert(pos,beg,end);
clear(); erase(beg,end); erase(pos);
|
vector与deque的比较
- vector.at()比deque.at()效率高,比如vector.at(0)是固定的,deque的开始位置 却是不固定的。
- 如果有大量释放操作的话,vector花的时间更少,这跟二者的内部实现有关。
- deque支持头部的快速插入与快速移除,这是deque的优点。
不过操作上,两者的操作大致相同,deque比vector多一些在头部插入的算法,且deque没有容量capacity的概念。
优先级队列
priority_queue
- 具体API与queue的相同!
- 底层采用的堆排序的算法,默认大根堆!,top元素是最大值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include <iostream> #include <string> #include <vector> #include <algorithm> #include <queue>
using namespace std;
struct stu { int id; string name; stu(int tid, string tname) { id = tid; name = tname; } bool operator<(const stu & other) const { return id > other.id; } };
int main() {
priority_queue<int> que;
que.push(3); que.push(1); que.push(5); que.push(2); que.push(4);
while (!que.empty()) { cout << que.top() << " "; que.pop(); } cout << endl;
priority_queue<int,vector<int>,greater<int>> que1;
que1.push(3); que1.push(1); que1.push(5); que1.push(2); que1.push(4);
while (!que1.empty()) { cout << que1.top() << " "; que1.pop(); } cout << endl;
stu st[5] = { stu(1,"cc"),stu(3,"bb"),stu(5,"aa"),stu(4,"dd"),stu(2,"ee") }; priority_queue<stu> stque{st,st+5};
while (!stque.empty()) { cout << stque.top().id << "-" << stque.top().name << endl; stque.pop(); }
return 0; }
|
参考连接:http://c.biancheng.net/view/480.html