欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

STL  priority_queue(優(yōu)先隊(duì)列)詳解

 更新時(shí)間:2016年10月26日 11:17:03   投稿:lqh  
這篇文章主要介紹了 STL priority_queue(優(yōu)先隊(duì)列)詳解的相關(guān)資料,需要的朋友可以參考下

構(gòu)造,析構(gòu)

priority_queue() //默認(rèn)構(gòu)造函數(shù),生成一個(gè)空的排序隊(duì)列 

priority_queue(const queue&); //拷貝構(gòu)造函數(shù) 

priority_queue(const Compare& comp);
//構(gòu)造生成一個(gè)空的priority_queue對(duì)象,
//使用comp作為priority_queue的comparison 

priority_queue(const value_type* first, const value_type* last); 
//帶有兩個(gè)參數(shù)的構(gòu)造函數(shù), 
//使用默認(rèn)的Comparison作為第三個(gè)參數(shù) 

priority_queue& operator=(const priority_queue &);  
//賦值運(yùn)算符重載 

c.~priority_queue() //銷(xiāo)毀所有元素并釋放內(nèi)存 

### 常用函數(shù)###

empty();//判斷是否為空 

push(Elem e);//隊(duì)列尾部增加一元素 

pop();//隊(duì)列頭部數(shù)據(jù)出隊(duì) 

top();//返回頭部數(shù)據(jù) 

size();//返回棧中元素個(gè)數(shù) 

### 改變排列順序###
priority_queue < Type, Container, Functional >
如果我們把后面?zhèn)z個(gè)參數(shù)缺省的話,優(yōu)先隊(duì)列就是大頂堆,
隊(duì)頭元素最大。在很多時(shí)候,我們需要的不一定是最大值,
也有可能是最小值。這是就需要我們來(lái)改變priority_queue中的順序。

方法有兩種:
           1.如果加入優(yōu)先隊(duì)列的是基本類(lèi)型,那么我們就可以這樣,我們以int為例:

   //注意greater<int> >這之間有一個(gè)空格   
priority_queue<int, vector<int>, greater<int> >Q;  

           2.對(duì)于自定義數(shù)據(jù)類(lèi)型的話,我們不論是要改變排序方式,還是不改變都要這樣 – 重載 小于( < ) 運(yùn)算符:
因?yàn)?,如果你不重載比較運(yùn)算符的話,編譯器無(wú)法比較自定義數(shù)據(jù)類(lèi)型的大小關(guān)系。然而又因?yàn)樵趐riority_queue的內(nèi)部,只需用到 小于號(hào)(<),所以我們只需要重載小于號(hào)即可。當(dāng)然對(duì)于自定義數(shù)據(jù)類(lèi)型來(lái)說(shuō),也是必須重載,否則將無(wú)法使用priority_queue。重載小于號(hào),我們可以有兩種方式,一種用成員函數(shù),一種使用友元函數(shù)(這里就不多說(shuō)了,不會(huì)的同學(xué),自己在好好復(fù)習(xí)復(fù)習(xí)C++)

### 優(yōu)先隊(duì)列的使用范例###

#include <queue> 
#include <list> 
#include <cstdio> 
using namespace std; 
/** 
 優(yōu)先級(jí)隊(duì)列的使用范例 
*/ 
int main(){ 
  //優(yōu)先隊(duì)列默認(rèn)是使用vector作為容器 
  priority_queue<int> a; 
  // priority_queue<int,list<int>> b;//可以這樣定義,但無(wú)法使用 
  int i; 
  //壓入數(shù)據(jù) 
  for(i=0;i<10;i++){ 
   a.push(i*2-5); 
   //b.push(i);//編譯錯(cuò)誤 
  } 
  printf("優(yōu)先隊(duì)列的大小=%d\n",a.size()); 
  while(!a.empty()){ 
    printf("%d\n",a.top()); 
    a.pop();//出隊(duì) 
  } 
  putchar('\n'); 
  return 0; 
} 

### 優(yōu)先隊(duì)列帶比較函數(shù)示例(針對(duì)結(jié)構(gòu)體)###

下面程序是針對(duì)結(jié)構(gòu)體的,對(duì)數(shù)據(jù)的比較是通過(guò)對(duì)結(jié)構(gòu)體重載operator()。
程序功能是模擬排隊(duì)過(guò)程,每人有姓名和優(yōu)先級(jí),優(yōu)先級(jí)相同則比較姓名,開(kāi)始有5個(gè)人進(jìn)入隊(duì)列,然后隊(duì)頭2個(gè)人出隊(duì),再有3個(gè)人進(jìn)入隊(duì)列,最后所有人都依次出隊(duì),程序會(huì)輸出離開(kāi)隊(duì)伍的順序

#include <queue> 
#include <cstring> 
#include <cstdio> 
using namespace std; 
/** 
 結(jié)構(gòu)體 
*/ 
struct Node{ 
  char szName[20];//人名 
  int priority;//優(yōu)先級(jí) 
  //構(gòu)造函數(shù) 
  Node(int nri, char *pszName){ 
    strcpy(szName, pszName); 
    priority = nri; 
  } 
}; 
/** 
 結(jié)構(gòu)體的比較方法 改寫(xiě)operator() 
*/ 
struct NodeCmp{ 
//重寫(xiě)operator()方法,注意這里重寫(xiě)的寫(xiě)法,operator()(參數(shù)1,...) 
  bool operator()(const Node &na, const Node &nb){ 
    if (na.priority != nb.priority) 
      return na.priority <= nb.priority; 
    else 
      return strcmp(na.szName, nb.szName) > 0; 
  } 
}; 
/** 
 打印節(jié)點(diǎn) 
*/ 
void PrintfNode(Node na){ 
  printf("%s %d\n", na.szName, na.priority); 
} 
int main(){ 
  //優(yōu)先級(jí)隊(duì)列默認(rèn)是使用vector作容器,底層數(shù)據(jù)結(jié)構(gòu)為堆。 
  priority_queue<Node, vector<Node>, NodeCmp> a; 

  //有5個(gè)人進(jìn)入隊(duì)列 
  a.push(Node(5, "小譚")); 
  a.push(Node(3, "小劉")); 
  a.push(Node(1, "小濤")); 
  a.push(Node(5, "小王")); 

  //隊(duì)頭的2個(gè)人出隊(duì) 
  PrintfNode(a.top()); 
  a.pop(); 
  PrintfNode(a.top()); 
  a.pop(); 
  printf("--------------------\n"); 

  //再進(jìn)入3個(gè)人 
  a.push(Node(2, "小白")); 
  a.push(Node(2, "小強(qiáng)")); 
  a.push(Node(3, "小新")); 

  //所有人都依次出隊(duì) 
  while (!a.empty()){ 
    PrintfNode(a.top()); 
    a.pop(); 
  } 
  return 0; 
} 

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論