STL之queue队列 stack栈 priority_queue优先队列 deque双向队列

た 入场券 2021-06-24 15:57 532阅读 0赞

一、queue

先进先出
empty() 是否为空
size() 返回大小
front() 返回队头数据
back() 返回队尾数据
push() 队尾压入一个数据
pop() 抛弃队头数据

stack

后进先出
empty() 是否为空
size() 返回大小
top 返回栈顶数据
push() 栈顶压入一个数据
pop() 抛弃栈顶数据

二、priority_queue

一般方法:
empty() 是否为空
size() 返回大小
push() 队尾压入一个数据
pop() 抛弃队头数据
top() 返回队头数据(并不会抛弃,需手动pop)

优先队列可以实现自动排序。其模板声明如下:
priority_queue

  1. int a[3] = {
  2. 123};
  3. priority_queue<int> pq;
  4. for(i = 0; i < 3; i++)
  5. pq.push(a[i]);
  6. for(i = 0; i < 3; i++)
  7. {
  8. cout<<pq.top()<<" "; // 输出:3 2 1。默认大顶堆,元素大的优先级高
  9. pq.pop();
  10. }

实现小顶堆:

  1. priority_queue<int, vector<int>, greater<int> > pq;
  2. struct Node{
  3. int x, y;
  4. Node(int a, int b): x(a), y(b) {}
  5. friend bool operator<(Node left, Node right){
  6. if( left.x == right.x ) return left.y> right.y;
  7. return left.x> right.x;
  8. }
  9. };
  10. priority_queue<Node> pq; // 只需定义一个struct就行了。
  11. struct Node{
  12. int x, y;
  13. Node(int a, int b): x(a), y(b) {}
  14. friend bool operator<(Node left, Node right){
  15. if( left.x == right.x ) return left.y> right.y;
  16. return left.x> right.x;
  17. }
  18. };
  19. struct Cmp{
  20. bool operator() (Node left, Node right){
  21. if( left.x == right.x ) return left.y> right.y;
  22. return left.x> right.x;
  23. }
  24. };
  25. priority_queue<Node, vector<Node>, Cmp> pq; // 第三个参数自定义时需分开。

三、deque

deque second (4,100)
at []
front()
back()
push_back()
pop_back()
push_front()
pop_front()
insert()
erase()
empty()
size()

其他

函数特化同时使用front和top:

  1. #include <iostream>
  2. #include <queue>
  3. template <typename Q> struct get_top;
  4. template <typename T> struct get_top <std::queue<T>>
  5. {
  6. static void apply (std::queue<T> const& q)
  7. {
  8. std::cout << "std::queue" << std::endl;
  9. q.front();
  10. }
  11. };
  12. template <typename T> struct get_top <std::priority_queue<T>>
  13. {
  14. static void apply (std::priority_queue<T> const& q)
  15. {
  16. std::cout << "std::priority_queue" << std::endl;
  17. q.top();
  18. }
  19. };
  20. template <typename Q>
  21. void t (Q const& q)
  22. {
  23. get_top<Q>::apply(q);
  24. }
  25. int main ()
  26. {
  27. std::queue<int> q0; t(q0);
  28. std::priority_queue<int> q1; t(q1);
  29. return 0;
  30. }

发表评论

表情:
评论列表 (有 0 条评论,532人围观)

还没有评论,来说两句吧...

相关阅读

    相关 [转]: STL priority_queue 优先队列

    刚开始学习算法不久,一些常用的算法工具还没有掌握,真是丢人! 前一段时间用到优先级队列时,都是自己手动通过最大堆或者最小堆来写一个,容易出错且耗时。接触到STL后,开始用ma

    相关 Python双向队列 (deque)

    -------------------- 任务描述 本关任务:编写一个能输出“震荡”队列的程序。 双向队列 (deque) 双向队列是一种能在队列两端都进行入队出队操作