C++中 queue 、 deque、priority_queue詳解

  • 最近看到一道題用到了隊列,在這裏就具體的分析一下C++中的這三種隊列的區別

queue

用法:
在這裏插入圖片描述ios

#include <iostream>
#include <queue>
using namespace std;
 
 
int main()
{
	queue<int> myQueue;
	cout << myQueue.empty() << endl;
	cout << myQueue.size()<< endl;
	myQueue.push(1);
	myQueue.push(2);
	myQueue.push(3);
	cout << myQueue.front()<<endl;
	cout << myQueue.back()<<endl;
	myQueue.pop();
	cout << myQueue.front()<<endl;
	cout << myQueue.back()<<endl;	
	return 0;
}

結果:
在這裏插入圖片描述web

deque

  • deque是雙向隊列Double ended queue;can be accessed with random access iterator數組

  • deque是雙端隊列,是能夠在兩端擴展和收縮的連續容器。通常deque的實現是基於某種形式的動態數組,容許單個元素用隨機獲取less

  • 迭代器隨機讀取,數組容量自動管理。dom

  • 所以它有和vector類似的函數,但在序列的開始也有高效的插入和刪除。但不像vector,deque的元素並非嚴格連續存儲的。svg

  • vector和deque有類似的接口和類似的目的,但內部實現大相徑庭函數

#include <iostream>
#include <deque>
using namespace std;
 
 
int main()
{
	deque<int> myDeque;
	myDeque.push_front(1);
	myDeque.push_front(2);
	myDeque.push_back(3);
	myDeque.push_back(4);
	myDeque.push_back(5);
	myDeque.push_front(6);
	myDeque.pop_back();
	deque<int>::iterator myItor;
	for(myItor=myDeque.begin(); myItor!=myDeque.end(); myItor++)
		cout<<*myItor<<endl;
		
	return 0;
}

執行結果:
在這裏插入圖片描述spa

priority_queue


  • 既然是隊列那麼先要包含頭文件#include code

  • 優先隊列具備隊列的全部特性,包括基本操做,只是在這基礎上添加了內部的一個排序,它本質是一個堆實現的
    定義:priority_queue<Type, Container, Functional>
    Type 就是數據類型,Container 就是容器類型(Container必須是用數組實現的容器,好比vector,deque等等,但不能用 list。STL裏面默認用的是vector),Functional 就是比較的方式,當須要用自定義的數據類型時才須要傳入這三個參數,使用基本數據類型時,只須要傳入數據類型,默認是大頂堆
    通常是:xml

//升序隊列 
priority_queue <int,vector<int>,greater<int> > q; 
//降序隊列
 priority_queue <int,vector<int>,less<int> >q; 

//greater和less是std實現的兩個仿函數(就是使一個類的使用看上去像一個函數。其實現就是類中實現一個operator(),這個類就有了相似函數的行爲,就是一個仿函數類了)
  1. 基本類型例子:
#include<iostream> 
#include <queue> 
using namespace std; 

int main() 
{ 
//對於基礎類型 默認是大頂堆 
priority_queue<int> a;
 //等同於 priority_queue<int, vector<int>, less<int> > a;
 //             這裏必定要有空格,否則成了右移運算符↓ 
 priority_queue<int, vector<int>, greater<int> > c; 
 //這樣就是小頂堆 priority_queue<string> b;
  for (int i = 0; i < 5; i++)
  { 
  	a.push(i); 
  	c.push(i); 
  } 
  while (!a.empty())
  { 
   	cout << a.top() << ' '; a.pop();
  }
  cout << endl;
  while (!c.empty()) 
  { 
      cout << c.top() << ' ';
       c.pop(); 
  } 
  cout << endl; 
  b.push("abc"); 
  b.push("abcd"); 
  b.push("cbd"); 
  while (!b.empty()) 
  { 
  	cout << b.top() << ' '; 
  	b.pop();
   } 
   cout << endl; return 0; 
   }

輸出:

4 3 2 1 0
0 1 2 3 4
cbd abcd abc

  1. pari的比較,先比較第一個元素,第一個相等比較第二個
#include <iostream> 
#include <queue> 
#include <vector> 
using namespace std;
 int main() 
 { 
 	priority_queue<pair<int, int> > a; 
 	pair<int, int> b(1, 2);
 	 pair<int, int> c(1, 3); 
 	 pair<int, int> d(2, 5); 
 	 a.push(d); 
 	 a.push(c);
 	 a.push(b); 
 	 while (!a.empty()) 
 	 { 
 	 	cout << a.top().first << ' ' << a.top().second << '\n'; 
 	 	a.pop(); 
 	 } 
}

結果:

2 5
1 3
1 2

  1. 對於自定義類型
#include <iostream>
#include <queue>
using namespace std;

//方法1
struct tmp1 //運算符重載<
{
    int x;
    tmp1(int a) {x = a;}
    bool operator<(const tmp1& a) const
    {
        return x < a.x; //大頂堆
    }
};

//方法2
struct tmp2 //重寫仿函數
{
    bool operator() (tmp1 a, tmp1 b) 
    {
        return a.x < b.x; //大頂堆
    }
};

int main() 
{
    tmp1 a(1);
    tmp1 b(2);
    tmp1 c(3);
    priority_queue<tmp1> d;
    d.push(b);
    d.push(c);
    d.push(a);
    while (!d.empty()) 
    {
        cout << d.top().x << '\n';
        d.pop();
    }
    cout << endl;

    priority_queue<tmp1, vector<tmp1>, tmp2> f;
    f.push(c);
    f.push(b);
    f.push(a);
    while (!f.empty()) 
    {
        cout << f.top().x << '\n';
        f.pop();
    }
}

輸出:

3
2
1

3
2
1