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

C++ STL priority_queue自定義排序?qū)崿F(xiàn)方法詳解

 更新時間:2021年03月04日 11:35:33   投稿:zx  
這篇文章主要介紹了C++ STL priority_queue自定義排序?qū)崿F(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前面講解 priority_queue 容器適配器時,還遺留一個問題,即當(dāng) <function> 頭文件提供的排序方式(std::less<T> 和 std::greater<T>)不再適用時,如何自定義一個滿足需求的排序規(guī)則。

首先,無論 priority_queue 中存儲的是基礎(chǔ)數(shù)據(jù)類型(int、double 等),還是 string 類對象或者自定義的類對象,都可以使用函數(shù)對象的方式自定義排序規(guī)則。例如:

#include<iostream>
#include<queue>
using namespace std;
//函數(shù)對象類
template <typename T>
class cmp
{
public:
  //重載 () 運算符
  bool operator()(T a, T b)
  {
    return a > b;
  }
};
int main()
{
  int a[] = { 4,2,3,5,6 };
  priority_queue<int,vector<int>,cmp<int> > pq(a,a+5);
  while (!pq.empty())
  {
    cout << pq.top() << " ";
    pq.pop();
  }
  return 0;
}

運行結(jié)果為:
2 3 4 5 6

注意,C++ 中的 struct 和 class 非常類似,前者也可以包含成員變量和成員函數(shù),因此上面程序中,函數(shù)對象類 cmp 也可以使用 struct 關(guān)鍵字創(chuàng)建:

struct cmp
{
  //重載 () 運算符
  bool operator()(T a, T b)
  {
    return a > b;
  }
};

可以看到,通過在 cmp 類(結(jié)構(gòu)體)重載的 () 運算符中自定義排序規(guī)則,并將其實例化后作為 priority_queue 模板的第 3 個參數(shù)傳入,即可實現(xiàn)為 priority_queue 容器適配器自定義比較函數(shù)。

除此之外,當(dāng) priority_queue 容器適配器中存儲的數(shù)據(jù)類型為結(jié)構(gòu)體或者類對象(包括 string 類對象)時,還可以通過重載其 > 或者 < 運算符,間接實現(xiàn)自定義排序規(guī)則的目的。

注意,此方式僅適用于 priority_queue 容器中存儲的為類對象或者結(jié)構(gòu)體變量,也就是說,當(dāng)存儲類型為類的指針對象或者結(jié)構(gòu)體指針變量時,此方式將不再適用,而只能使用函數(shù)對象的方式。

要想徹底理解這種方式的實現(xiàn)原理,首先要搞清楚 std::less<T> 和 std::greater<T> 各自的底層實現(xiàn)。實際上,<function> 頭文件中的 std::less<T> 和 std::greater<T> ,各自底層實現(xiàn)采用的都是函數(shù)對象的方式。比如,std::less<T> 的底層實現(xiàn)代碼為:

template <typename T>
struct less {
  //定義新的排序規(guī)則
  bool operator()(const T &_lhs, const T &_rhs) const {
    return _lhs < _rhs;
  }
};

std::greater<T> 的底層實現(xiàn)代碼為:

template <typename T>
struct greater {
  bool operator()(const T &_lhs, const T &_rhs) const {
    return _lhs > _rhs;
  }
};

可以看到,std::less<T> 和 std::greater<T> 底層實現(xiàn)的唯一不同在于,前者使用 < 號實現(xiàn)從大到小排序,后者使用 > 號實現(xiàn)從小到大排序。

那么,是否可以通過重載 < 或者 > 運算符修改 std::less<T> 和 std::greater<T> 的排序規(guī)則,從而間接實現(xiàn)自定義排序呢?答案是肯定的,舉個例子:

#include<queue>
#include<iostream>
using namespace std;
class node {
public:
  node(int x = 0, int y = 0) :x(x), y(y) {}
  int x, y;
};
//新的排序規(guī)則為:先按照 x 值排序,如果 x 相等,則按 y 的值排序
bool operator < (const node &a, const node &b) {
  if (a.x > b.x) return 1;
  else if (a.x == b.x)
    if (a.y >= b.y) return 1;
  return 0;
}
int main() {
  //創(chuàng)建一個 priority_queue 容器適配器,其使用默認的 vector 基礎(chǔ)容器以及 less 排序規(guī)則。
  priority_queue<node> pq;
  pq.push(node(1, 2));
  pq.push(node(2, 2));
  pq.push(node(3, 4));
  pq.push(node(3, 3));
  pq.push(node(2, 3));
  cout << "x y" << endl;
  while (!pq.empty()) {
    cout << pq.top().x << " " << pq.top().y << endl;
    pq.pop();
  }
  return 0;
}

輸出結(jié)果為:
x y
1 2
2 2
2 3
3 3
3 4

可以看到,通過重載 < 運算符,使得 std::less<T> 變得適用了。
讀者還可以自行嘗試,通過重載 > 運算符,賦予 std::greater<T> 和之前不同的排序方式。

當(dāng)然,也可以以友元函數(shù)或者成員函數(shù)的方式重載 > 或者 < 運算符。需要注意的是,以成員函數(shù)的方式重載 > 或者 < 運算符時,該成員函數(shù)必須聲明為 const 類型,且參數(shù)也必須為 const 類型,至于參數(shù)的傳值方式是采用按引用傳遞還是按值傳遞,都可以(建議采用按引用傳遞,效率更高)。

例如,將上面程序改為以成員函數(shù)的方式重載 < 運算符:

class node {
public:
  node(int x = 0, int y = 0) :x(x), y(y) {}
  int x, y;
  bool operator < (const node &b) const{
    if ((*this).x > b.x) return 1;
    else if ((*this).x == b.x)
      if ((*this).y >= b.y) return 1;
    return 0;
  }
};

同樣,在以友元函數(shù)的方式重載 < 或者 > 運算符時,要求參數(shù)必須使用 const 修飾。例如,將上面程序改為以友元函數(shù)的方式重載 < 運算符。例如:

class node {
public:
  node(int x = 0, int y = 0) :x(x), y(y) {}
  int x, y;
  friend bool operator < (const node &a, const node &b);
};
//新的排序規(guī)則為:先按照 x 值排序,如果 x 相等,則按 y 的值排序
bool operator < (const node &a, const node &b){
  if (a.x > b.x) return 1;
  else if (a.x == b.x)
    if (a.y >= b.y) return 1;
  return 0;
}

總的來說,以函數(shù)對象的方式自定義 priority_queue 的排序規(guī)則,適用于任何情況;而以重載 > 或者 < 運算符間接實現(xiàn) priority_queue 自定義排序的方式,僅適用于 priority_queue 中存儲的是結(jié)構(gòu)體變量或者類對象(包括 string 類對象)。

到此這篇關(guān)于C++ STL priority_queue自定義排序?qū)崿F(xiàn)方法詳解的文章就介紹到這了,更多相關(guān)STL priority_queue自定義排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MFC模擬實現(xiàn)自定義消息發(fā)送

    MFC模擬實現(xiàn)自定義消息發(fā)送

    在MFC框架下,有很多系統(tǒng)已經(jīng)定義好的消息,例如ON_WM_LBUTTONDOWN()、ON_WM_MBUTTONDOWN()等等。本文將利用這些定義好的消息模擬實現(xiàn)一下消息發(fā)送,需要的可以參考一下
    2022-01-01
  • STL中vector的使用你了解嗎

    STL中vector的使用你了解嗎

    這篇文章主要為大家詳細介紹了STL中vector的使用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++?TCP網(wǎng)絡(luò)編程詳細講解

    C++?TCP網(wǎng)絡(luò)編程詳細講解

    TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission?Control?Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層
    2022-09-09
  • 快速了解Boost.Asio 的多線程模型

    快速了解Boost.Asio 的多線程模型

    這篇文章主要介紹了Boost.Asio 的多線程模型的相關(guān)知識,文中代碼非常詳細,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C++?指針傳遞的作用小結(jié)

    C++?指針傳遞的作用小結(jié)

    本文主要介紹了C++?指針傳遞的作用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C/C++使用C語言實現(xiàn)多態(tài)

    C/C++使用C語言實現(xiàn)多態(tài)

    這篇文章主要介紹了C/C++多態(tài)的實現(xiàn)機制理解的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08
  • 如何實現(xiàn)在C++中調(diào)用C函數(shù)

    如何實現(xiàn)在C++中調(diào)用C函數(shù)

    這篇文章主要介紹了如何實現(xiàn)在C++中調(diào)用C函數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++ 學(xué)習(xí)之旅三 我和超級瑪麗有個約會

    C++ 學(xué)習(xí)之旅三 我和超級瑪麗有個約會

    學(xué)習(xí)了c++有一周有余了吧,感謝孫鑫老師的視頻教程,讓我   對C++有了基本的了解,并理解到C++與.net 的許許多多的區(qū)別,更要感謝網(wǎng)民為programaking的人,會為我提供了超級瑪麗制作揭秘 這套寶貴的教程,讓我 做做出了這個項目,對c++ 有了一個更深層次的認識
    2012-11-11
  • C++實現(xiàn)旋轉(zhuǎn)掃描儀的示例代碼

    C++實現(xiàn)旋轉(zhuǎn)掃描儀的示例代碼

    旋轉(zhuǎn)掃描儀(Rotating?Scanner),也稱為旋轉(zhuǎn)掃描儀或圓形掃描儀,是一種用于獲取圖像和文檔的設(shè)備,下面就跟隨小編一起來學(xué)習(xí)一下如何使用C++實現(xiàn)旋轉(zhuǎn)掃描儀功能吧
    2024-02-02
  • VSCode之CMake使用小結(jié)

    VSCode之CMake使用小結(jié)

    本文主要介紹了VSCode之CMake使用小結(jié),文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03

最新評論