国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

關(guān)于C++中排序和建堆的比較規(guī)則:std::greater()、std::less()、自定義比較規(guī)則

這篇具有很好參考價(jià)值的文章主要介紹了關(guān)于C++中排序和建堆的比較規(guī)則:std::greater()、std::less()、自定義比較規(guī)則。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

排序和建堆的使用方式(自定義為例)

在C++中,排序和建堆的比較規(guī)則是通過比較函數(shù)或者比較對(duì)象來定義的。這通常涉及到使用函數(shù)對(duì)象(Functor)或者函數(shù)指針,以決定元素之間的大小關(guān)系。
舉例: 利用函數(shù)排序

#include <iostream>
#include <vector>
#include <algorithm>

// 自定義比較函數(shù)
bool myComparator(int a, int b) {
    return a > b; // 降序排序
}

int main() {
    std::vector<int> vec = {5, 2, 8, 1, 6};

    // 使用自定義比較函數(shù)進(jìn)行降序排序
    std::sort(vec.begin(), vec.end(), myComparator);

    // 輸出排序后的結(jié)果
    for (int num : vec) {
        std::cout << num << " ";
    }

    return 0;
}

舉例: 利用對(duì)象排序,注意sort第三個(gè)實(shí)參中有括號(hào),是建立臨時(shí)對(duì)象

#include <iostream>
#include <vector>
#include <algorithm>

// 自定義比較對(duì)象
struct MyComparator {
    bool operator()(int a, int b) {
        return a > b; // 降序排序
    }
};

int main() {
    std::vector<int> vec = {5, 2, 8, 1, 6};

    // 使用自定義比較對(duì)象進(jìn)行降序排序
    std::sort(vec.begin(), vec.end(), MyComparator());

    // 輸出排序后的結(jié)果
    for (int num : vec) {
        std::cout << num << " ";
    }

    return 0;
}

舉例: 利用對(duì)象建堆,注意優(yōu)先級(jí)隊(duì)列(本例中為小頂堆)第三個(gè)模板參數(shù)不帶括號(hào)

#include <iostream>
#include <queue>

// 自定義比較對(duì)象
struct MyComparator {
    bool operator()(int a, int b) {
        return a > b; // 小頂堆,小的元素排在前面
    }
};

int main() {
    std::priority_queue<int, std::vector<int>, MyComparator> minHeap;

    // 插入元素
    minHeap.push(5);
    minHeap.push(2);
    minHeap.push(8);
    minHeap.push(1);
    minHeap.push(6);

    // 彈出并輸出元素
    while (!minHeap.empty()) {
        std::cout << minHeap.top() << " ";
        minHeap.pop();
    }

    return 0;
}

結(jié)論

如果是排序,less<T>是升序,(從左到右遍歷下標(biāo),數(shù)組元素從小到大);greater<T>是降序(從左到右遍歷下標(biāo),元素從大到?。?。
如果是建堆,less<T>是大頂堆,greater<T>是小頂堆。

less()、greater()原理

假設(shè)比較規(guī)則就是comp(a, b),對(duì)于排序來說,左邊元素就是前一個(gè)a,右邊元素就是后一個(gè)b;對(duì)于建堆,新插入一個(gè)元素時(shí),插入到最后一個(gè)葉子,這時(shí)要整理堆內(nèi)元素滿足大/小頂堆,a代表新插入的結(jié)點(diǎn),b代表它的父節(jié)點(diǎn)。
我們寫自定義比較規(guī)則就可以依照這個(gè)規(guī)則。
而標(biāo)準(zhǔn)庫中的less<T>就是讓a比b小,對(duì)應(yīng)排序就是左邊比右邊小,就是升序;對(duì)于建堆就是讓新插入節(jié)點(diǎn)比它的父結(jié)點(diǎn)小,就是大頂堆。
greater<T>相反。

默認(rèn)都是用less<T>。

自定義規(guī)則

這部分參考里的例子寫的很好,直接貼過來了。

符合兩個(gè)條件:
bool:返回值bool
return x<y;:重載<之類的操作符,并且要決定比較什么元素。
PS:建議還要常引用,保險(xiǎn),禁止發(fā)生修改要比較的元素可能。

舉例:數(shù)組
函數(shù):使用時(shí)不加括號(hào),加了報(bào)錯(cuò)

類的對(duì)象:注意,排序時(shí)的類必須使用類的對(duì)象才對(duì),直接使用類報(bào)錯(cuò)。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

// 重寫排序函數(shù)
bool cmpfunc(const int &a, const int &b)
{
    return a < b;
    // < 升序; > 降序
}

// 模仿less、greater構(gòu)建類
struct cmpClass
{
    bool operator()(const int &i, const int &j)
    {
        return (i < j);
    }
}cmpClassObject;		// 注意,排序時(shí)的類必須使用類的對(duì)象才對(duì),使用類報(bào)錯(cuò)。

int main()
{
	// 使用函數(shù)
    vector<int> v1 = {2, 3, 1, 6, 2, 5, 4};
    // 使用時(shí)不加括號(hào),加了報(bào)錯(cuò)
    sort(v1.begin(), v1.end(), cmpfunc);
    for (int i = 0; i < v1.size(); i++)
    {
        cout << v1[i] << " ";
    }
    cout << endl;
    // 1 2 2 3 4 5 6
    
    // 使用類的對(duì)象
    vector<int> v2 = {2, 3, 1, 6, 2, 5, 4};
    sort(v2.begin(), v2.end(), cmpClassObject);
    for (int i = 0; i < v2.size(); i++)
    {
        cout << v2[i] << " ";
    }
    cout << endl;
    // 1 2 2 3 4 5 6
    return 0;
}

舉例:優(yōu)先級(jí)隊(duì)列
定義類時(shí)同時(shí)定義操作符重載函數(shù):操作符重載函數(shù),必須是具體的操作符<之類的,寫()報(bào)錯(cuò)

自定義類,自定義比較函數(shù):操作符重載函數(shù),必須是具體的操作符<之類的,寫()報(bào)錯(cuò)

自定義類,自定義包含比較函數(shù)的結(jié)構(gòu)體:操作符重載函數(shù),必須是寫()

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

/******** 定義類時(shí)同時(shí)定義操作符重載函數(shù) ********/
struct Node1
{
    // 要比較的元素
    int x;
    // 構(gòu)造函數(shù)
    Node1(int x) { this->x = x; }
    // 操作符重載函數(shù),必須是具體的操作符<之類的,寫()報(bào)錯(cuò)
    bool operator<(const Node1 &b) const
    {
        // 實(shí)現(xiàn)less中需要的<,大頂堆
        return x < b.x;
    }
};

/******** 自定義類,自定義比較函數(shù) ********/
struct Node2
{
    // 要比較的元素
    int x;
    // 構(gòu)造函數(shù)
    Node2(int x) { this->x = x; }
};

// 操作符重載函數(shù),必須是具體的操作符<之類的,寫()報(bào)錯(cuò)
bool operator<(const Node2 &a, const Node2 &b)
{
    // less,大頂堆
    return a.x < b.x;
}

/******** 自定義類,自定義包含比較函數(shù)的結(jié)構(gòu)體 ********/
struct Node3
{
    // 要比較的元素
    int x;
    // 構(gòu)造函數(shù)
    Node3(int x) { this->x = x; }
};

struct cmpClass
{
    // 操作符重載函數(shù),必須是寫()
    bool operator()(const Node3 &a, const Node3 &b)
    {
        // less,大頂堆
        return a.x < b.x;
    }
};

int main()
{
    /******** 初始化優(yōu)先級(jí)隊(duì)列的對(duì)象p ********/
    // Node1類型,默認(rèn)使用vector,小頂堆,同 priority_queue<Node1, vector<Node1>, less<Node1> > p;
    priority_queue<Node1> p;

    // 亂序入隊(duì)
    p.emplace(1);
    p.emplace(3);
    p.emplace(2);

    // 彈出隊(duì)首
    while (!p.empty())
    {
        cout << p.top().x << " ";
        p.pop();
    }
    cout << endl;
    // 3 2 1

    /******** 初始化優(yōu)先級(jí)隊(duì)列的對(duì)象q ********/
    // 同 priority_queue<Node2> q;
    priority_queue<Node2, vector<Node2>, less<Node2>> q;

    // 亂序入隊(duì)
    q.emplace(1);
    q.emplace(3);
    q.emplace(2);

    // 彈出隊(duì)首
    while (!q.empty())
    {
        cout << q.top().x << " ";
        q.pop();
    }
    cout << endl;
    // 3 2 1

    /******** 初始化優(yōu)先級(jí)隊(duì)列的對(duì)象r ********/
    priority_queue<Node3, vector<Node3>, cmpClass> r;

    // 亂序入隊(duì)
    r.emplace(1);
    r.emplace(3);
    r.emplace(2);

    // 彈出隊(duì)首
    while (!r.empty())
    {
        cout << r.top().x << " ";
        r.pop();
    }
    cout << endl;
    // 3 2 1
    return 0;
}

參考:
C++:std::greater()、std::less()、自定義比較函數(shù)的規(guī)則
C++ std::優(yōu)先級(jí)隊(duì)列priority_queue文章來源地址http://www.zghlxwxcb.cn/news/detail-809680.html

到了這里,關(guān)于關(guān)于C++中排序和建堆的比較規(guī)則:std::greater()、std::less()、自定義比較規(guī)則的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • (Java)數(shù)據(jù)結(jié)構(gòu)——排序(第一節(jié))堆排序+PTA L2-012 關(guān)于堆的判斷

    (Java)數(shù)據(jù)結(jié)構(gòu)——排序(第一節(jié))堆排序+PTA L2-012 關(guān)于堆的判斷

    本博客是博主用于復(fù)習(xí)數(shù)據(jù)結(jié)構(gòu)以及算法的博客,如果疏忽出現(xiàn)錯(cuò)誤,還望各位指正。 堆排序是一種基于堆數(shù)據(jù)結(jié)構(gòu)的排序算法,其核心思想是將待排序的序列構(gòu)建成一個(gè)最大堆(或最小堆),然后將堆頂元素與最后一個(gè)元素交換,再將剩余元素重新調(diào)整為最大堆(或最小堆

    2024年04月12日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】深度剖析最優(yōu)建堆及堆的經(jīng)典應(yīng)用 - 堆排列與topk問題

    【數(shù)據(jù)結(jié)構(gòu)】深度剖析最優(yōu)建堆及堆的經(jīng)典應(yīng)用 - 堆排列與topk問題

    ?? 紙上得來終覺淺, 絕知此事要躬行。 ??主頁:June-Frost ??專欄:數(shù)據(jù)結(jié)構(gòu) ??該文章分別探討了向上建堆和向下建堆的復(fù)雜度和一些堆的經(jīng)典應(yīng)用 - 堆排列與topk問題。 ??該文章內(nèi)的思想需要用到實(shí)現(xiàn)堆結(jié)構(gòu)的一些思想(如向上調(diào)整和向下調(diào)整等),可以在另一篇文章

    2024年02月08日
    瀏覽(19)
  • C++面試八股文:std::array如何實(shí)現(xiàn)編譯器排序?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第25面: 面試官: array 熟悉嗎? 二師兄:你說的是原生數(shù)組還是 std::array ? 面試官:你覺得兩者有什么區(qū)別? 二師兄:區(qū)別不是很大,原生數(shù)組(非動(dòng)態(tài)數(shù)組)和std::array都在棧上開辟空間,初始化的時(shí)候需要提供數(shù)組長(zhǎng)度,且

    2024年02月10日
    瀏覽(26)
  • 堆(兩種建堆方法)、堆排序和Top-K問題

    堆(兩種建堆方法)、堆排序和Top-K問題

    是一種完全二叉樹,分為大堆,小堆 如果有一個(gè)關(guān)鍵碼的集合 int K[ ] = {27,15,19,18,28,34,65,49,25,37} ; 把它的所有元素按完全二叉樹的順序存儲(chǔ)方式存儲(chǔ) 在一個(gè)一維數(shù)組中,并滿足:K i =K 2*i+1 且K i =K 2*i+2 ( K i =K 2*i+1 且K i =K 2*i+2 ) i = 0,1, 2…,則稱為小堆(或大堆)。將根節(jié)點(diǎn)最大

    2023年04月09日
    瀏覽(22)
  • <C++> list容器本質(zhì)|常用接口|自定義排序規(guī)則

    <C++> list容器本質(zhì)|常用接口|自定義排序規(guī)則

    ?作者簡(jiǎn)介:熱愛后端語言的大學(xué)生,CSDN內(nèi)容合伙人 ?精品專欄:C++面向?qū)ο???系列專欄:C++泛型編程 ??前言 今天把 list 容器的基本操作、常用接口做一個(gè)系統(tǒng)的整理,結(jié)合具體案例熟悉自定義內(nèi)部排序方法的使用。 list 與 vector 是STL中最常用的兩個(gè)容器,如果對(duì)vector

    2024年02月01日
    瀏覽(28)
  • std::copy與memcpy比較

    std::copy和memcpy都可以用于內(nèi)存塊之間的復(fù)制操作,但有幾個(gè)重要的異同點(diǎn): 相同點(diǎn): 它們都是C++中的函數(shù),用于內(nèi)存塊之間的復(fù)制。 它們都是通過指針操作進(jìn)行內(nèi)存復(fù)制。 不同點(diǎn): std::copy是C++標(biāo)準(zhǔn)庫中的函數(shù),用于將一個(gè)范圍內(nèi)的元素從源地址復(fù)制到目標(biāo)地址。因此它更

    2024年02月12日
    瀏覽(11)
  • 【數(shù)據(jù)結(jié)構(gòu)】堆:堆的構(gòu)建,堆的向上調(diào)整算法,堆的向下調(diào)整算法、堆排序

    【數(shù)據(jù)結(jié)構(gòu)】堆:堆的構(gòu)建,堆的向上調(diào)整算法,堆的向下調(diào)整算法、堆排序

    目錄 一、堆的定義 1、堆的定義: 2、根節(jié)點(diǎn)與其左、右孩子間的聯(lián)系 ??二、堆的創(chuàng)建 1、堆的向下調(diào)整算法? 2、堆的向上調(diào)整算法? 三、堆排序 1、堆的定義: 堆可以被看作是 一棵 完全二叉樹 的 數(shù)組 對(duì)象 。即在 存儲(chǔ)結(jié)構(gòu)上是數(shù)組,在邏輯結(jié)構(gòu)上是一棵完全二叉樹 。在

    2024年01月22日
    瀏覽(30)
  • mysql 字符集、比較規(guī)則, 比較規(guī)則底層邏輯

    mysql 字符集、比較規(guī)則, 比較規(guī)則底層邏輯

    字符集的級(jí)別 show variables like ‘%charecter%’; character_set_server 服務(wù)器級(jí)別 一般在 5.7: C:ProgramDataMySQLMySQL Server 5.7my.ini 8.0: C:ProgramDataMySQLMySQL Server 5.7my.ini Linux 系列 vim /etc/my.cnf character_set_server=xxx # 設(shè)定默認(rèn)字符集 collation_server=xxx_chinese_ci # 對(duì)應(yīng)的默認(rèn)的比較規(guī)則 charac

    2024年02月11日
    瀏覽(26)
  • 關(guān)于堆的一切

    首先給出堆的定義: 堆是一顆樹,滿足堆的性質(zhì),即: 對(duì)于一個(gè)節(jié)點(diǎn),它的權(quán)值大于(或小于)它的各個(gè)兒子的權(quán)值 有這個(gè)性質(zhì),顯然 堆的根節(jié)點(diǎn)權(quán)值是整個(gè)堆中最大或最小的 由此可分為 小根堆 和 大根堆 最常見的堆就是二叉堆 二叉堆是一顆滿足 堆的性質(zhì) 的 完全二叉樹

    2024年03月13日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包