最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++之set自定義排序問題

 更新時間:2023年11月08日 09:20:14   作者:滄海漂游_  
這篇文章主要介紹了C++之set自定義排序問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

set簡介

set一般插入元素時,默認使用關(guān)鍵字類型的< 運算符來比較兩個關(guān)鍵字,

故一般插入后為升序,但是針對自定義數(shù)據(jù)結(jié)構(gòu),

如結(jié)構(gòu)體,沒有< 運算符,故無法進行比較。

針對自定義數(shù)據(jù)結(jié)構(gòu)或者說自定義set排序規(guī)則有如下幾種方法:

方法一 重載<

在自定義結(jié)構(gòu)體中重載< 則可以實現(xiàn)默認排序,

示例代碼如下:

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

struct Students
{
    string id;
    int age,height;
    Students(string s,int a,int h):id(s),age(a),height(h){}
    Students() {}
    bool operator <(const Students &s) const {
        if(id!=s.id) return id<s.id;
        else return age<s.age;
    }
};
int main(){
    set<Students> se;
    se.insert(Students("zhou",12,134));
    se.insert(Students("wu",13,42));
    se.insert(Students("zheng",34,43));
    se.emplace("wang",13,43);
    se.emplace("zhou",23,43);
    for(auto it=se.begin();it!=se.end();it++){
        cout<<it->id<<" "<<it->age<<" "<<it->height<<endl;
    }
    return 0;
}

運行結(jié)果如下:


這里寫圖片描述

方法二 重載()

示例代碼如下:

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

struct Students
{
    string id;
    int age,height;
    Students(string s,int a,int h):id(s),age(a),height(h){}
    Students() {}
};

class comp{
public:
    bool operator()(const Students &s1,const Students &s2){
        if(s1.id!=s2.id) return s1.id<s2.id;
        return s1.age<s2.age;
    }
};

int main(){
    set<Students,comp> se;
    se.insert(Students("zhou",12,134));
    se.insert(Students("wu",13,42));
    se.insert(Students("zheng",34,43));
    se.emplace("wang",13,43);
    se.emplace("zhou",23,43);
    for(auto it=se.begin();it!=se.end();it++){
        cout<<it->id<<" "<<it->age<<" "<<it->height<<endl;
    }
    return 0;
}

方法三 參考《C++ primer(第五版)》

示例代碼如下:

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

struct Students
{
    string id;
    int age,height;
    Students(string s,int a,int h):id(s),age(a),height(h){}
    Students() {}
};

bool cmp(const Students &s1,const Students &s2){
    if(s1.id!=s2.id) return s1.id<s2.id;
    return s1.age<s2.age;
}

int main(){
    set<Students,decltype(cmp)*> se(cmp);
    se.insert(Students("zhou",12,134));
    se.insert(Students("wu",13,42));
    se.insert(Students("zheng",34,43));
    se.emplace("wang",13,43);
    se.emplace("zhou",23,43);
    for(auto it=se.begin();it!=se.end();it++){
        cout<<it->id<<" "<<it->age<<" "<<it->height<<endl;
    }
    return 0;
}

上述代碼中,用decltype 來指出自定義操作的類型。

當使用decltype 來獲得一個函數(shù)指針類型時,必須加上一個* 來指出我們要使用一個給定函數(shù)類型的指針。

cmp 來初始化se對象,這表示當我們向se中插入元素時,通過調(diào)用cmp來為這些元素排序。

可以使用cmp代替&cmp作為構(gòu)造函數(shù)的參數(shù),因為當我們使用一個函數(shù)的名字時,在需要的情況下會自動轉(zhuǎn)化為一個指針,使用&cmp 效果也是一樣的。

insert 和 emplace 的使用

emplace對應(yīng)insert,emplace_back對應(yīng)于push_back;

但是insertpush_back是直接將對象拷貝至容器當中,而emplaceemplace_back是先調(diào)用存儲對象構(gòu)造函數(shù),在內(nèi)存中生成對象,然后拷貝至容器中。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)csv文件轉(zhuǎn)xls

    Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)csv文件轉(zhuǎn)xls

    這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)csv文件轉(zhuǎn)xls功能,文中的示例代碼講解詳細,對我們學習或工作有一定參考價值,需要的可以了解一下
    2022-06-06
  • C語言中結(jié)構(gòu)體和共用體實例教程

    C語言中結(jié)構(gòu)體和共用體實例教程

    這篇文章主要給大家介紹了關(guān)于C語言中結(jié)構(gòu)體和共用體的相關(guān)資料,結(jié)構(gòu)體是一種自定義的復合數(shù)據(jù)類型,共用體也叫聯(lián)合體,使幾個不同類型的變量共占一段內(nèi)存(相互覆蓋),需要的朋友可以參考下
    2021-06-06
  • DevC++如何自定義頭文件并使用

    DevC++如何自定義頭文件并使用

    文章介紹了如何在DevC++中自定義頭文件并使用,首先創(chuàng)建一個項目,然后新建一個頭文件并編寫代碼,保存后創(chuàng)建一個源文件并將其放在項目目錄下
    2024-11-11
  • protobuf c++編程筆記

    protobuf c++編程筆記

    這篇文章主要介紹了Protobuf的c++編程筆記,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • C++ 的 format 和 vformat 函數(shù)示例詳解

    C++ 的 format 和 vformat 函數(shù)示例詳解

    傳統(tǒng)C庫的printf系列函數(shù)存在安全問題,而C++推薦的基于流格式化輸入輸出雖然解決了安全性問題,但在易用性方面仍顯不足,C++11引入了新的C風格字符串格式化函數(shù),但類型安全問題依舊存在,下面通過本文介紹C++ 的 format 和 vformat 函數(shù)示例,感興趣的朋友一起看看吧
    2025-02-02
  • C++遺傳算法類文件實例分析

    C++遺傳算法類文件實例分析

    這篇文章主要介紹了C++遺傳算法的一個類文件,是學習遺傳算法的絕佳參考資料,需要的朋友可以參考下
    2014-08-08
  • C++原地刪除有序數(shù)組重復項的N種方法

    C++原地刪除有序數(shù)組重復項的N種方法

    給定一個排序數(shù)組,你需要在原地刪除重復出現(xiàn)的元素,使得每個元素只出現(xiàn)一次,返回移除后數(shù)組的新長度,不要使用額外的數(shù)組空間,你必須在 原地 修改輸入數(shù)組 并在使用O(1)額外空間的條件下完成,故本文介紹了C++原地刪除有序數(shù)組重復項的N種方法,需要的朋友可以參考下
    2025-03-03
  • C語言函數(shù)的遞歸調(diào)用詳情

    C語言函數(shù)的遞歸調(diào)用詳情

    這篇文章主要介紹了C語言函數(shù)的遞歸調(diào)用詳情,遞歸做為一種算法在程序設(shè)計語言中廣泛應(yīng)用,主要的思考方式就是大事化小,下文具體的相關(guān)介紹,需要的小伙伴可以參考一下
    2022-04-04
  • 深入解析Linux下\r\n的問題

    深入解析Linux下\r\n的問題

    本篇文章是對Linux下\r\n的問題進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)LeetCode(50.求x的n次方)

    C++實現(xiàn)LeetCode(50.求x的n次方)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(50.求x的n次方),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論

左权县| 开原市| 墨竹工卡县| 乡城县| 靖远县| 周宁县| 神木县| 阿拉善左旗| 梁山县| 邯郸县| 通化县| 资溪县| 交城县| 固阳县| 旬阳县| 涟源市| 黄冈市| 石首市| 双流县| 彭山县| 汨罗市| 大冶市| 徐州市| 松江区| 浙江省| 富宁县| 绵竹市| 萨迦县| 永清县| 乳源| 喀什市| 工布江达县| 沙河市| 信阳市| 牙克石市| 安国市| 周至县| 丰县| 昌乐县| 阿合奇县| 新兴县|