欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

c++優(yōu)先隊(duì)列(priority_queue)用法詳解

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊: 次

普通的隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),元素在隊(duì)列尾追加,而從隊(duì)列頭刪除。

在優(yōu)先隊(duì)列中,元素被賦予優(yōu)先級(jí)。當(dāng)訪問(wèn)元素時(shí),具有最高優(yōu)先級(jí)的元素最先刪除。優(yōu)先隊(duì)列具有最高級(jí)先出 (first in, largest out)的行為特征。

首先要包含頭文件#include<queue>, 他和queue不同的就在于我們可以自定義其中數(shù)據(jù)的優(yōu)先級(jí), 讓優(yōu)先級(jí)高的排在隊(duì)列前面,優(yōu)先出隊(duì)。

優(yōu)先隊(duì)列具有隊(duì)列的所有特性,包括隊(duì)列的基本操作,只是在這基礎(chǔ)上添加了內(nèi)部的一個(gè)排序,它本質(zhì)是一個(gè)堆實(shí)現(xiàn)的。

和隊(duì)列基本操作相同:

  • top 訪問(wèn)隊(duì)頭元素
  • empty 隊(duì)列是否為空
  • size 返回隊(duì)列內(nèi)元素個(gè)數(shù)
  • push 插入元素到隊(duì)尾 (并排序)
  • emplace 原地構(gòu)造一個(gè)元素并插入隊(duì)列
  • pop 彈出隊(duì)頭元素
  • swap 交換內(nèi)容

定義:priority_queue<Type, Container, Functional>
Type 就是數(shù)據(jù)類型,Container 就是容器類型(Container必須是用數(shù)組實(shí)現(xiàn)的容器,比如vector,deque等等,但不能用 list。STL里面默認(rèn)用的是vector),F(xiàn)unctional 就是比較的方式。

當(dāng)需要用自定義的數(shù)據(jù)類型時(shí)才需要傳入這三個(gè)參數(shù),使用基本數(shù)據(jù)類型時(shí),只需要傳入數(shù)據(jù)類型,默認(rèn)是大頂堆。
一般是:

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

//greater和less是std實(shí)現(xiàn)的兩個(gè)仿函數(shù)(就是使一個(gè)類的使用看上去像一個(gè)函數(shù)。其實(shí)現(xiàn)就是類中實(shí)現(xiàn)一個(gè)operator(),這個(gè)類就有了類似函數(shù)的行為,就是一個(gè)仿函數(shù)類了)

1、基本類型優(yōu)先隊(duì)列的例子:

#include<iostream>
#include <queue>
using namespace std;
int main() 
{
  //對(duì)于基礎(chǔ)類型 默認(rèn)是大頂堆
  priority_queue<int> a; 
  //等同于 priority_queue<int, vector<int>, less<int> > a;
  
  //   這里一定要有空格,不然成了右移運(yùn)算符↓↓
  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;
}

運(yùn)行結(jié)果:

4 3 2 1 0
0 1 2 3 4
cbd abcd abc
請(qǐng)按任意鍵繼續(xù). . .

2、用pair做優(yōu)先隊(duì)列元素的例子:

規(guī)則:pair的比較,先比較第一個(gè)元素,第一個(gè)相等比較第二個(gè)。

#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();
  }
}

運(yùn)行結(jié)果:

2 5
1 3
1 2
請(qǐng)按任意鍵繼續(xù). . .

3、用自定義類型做優(yōu)先隊(duì)列元素的例子

#include <iostream>
#include <queue>
using namespace std;

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

//方法2
struct tmp2 //重寫仿函數(shù)
{
  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(b);
  f.push(c);
  f.push(a);
  while (!f.empty()) 
  {
    cout << f.top().x << '\n';
    f.pop();
  }
}

運(yùn)行結(jié)果:

3
2
1
 
3
2
1
請(qǐng)按任意鍵繼續(xù). . .

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

上一篇:C語(yǔ)言實(shí)現(xiàn)飛機(jī)訂票系統(tǒng)

欄    目:C語(yǔ)言

下一篇:純C語(yǔ)言實(shí)現(xiàn)火車售票系統(tǒng)

本文標(biāo)題:c++優(yōu)先隊(duì)列(priority_queue)用法詳解

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/20.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有