1. 程式人生 > >C++ set自定義排序

C++ set自定義排序

set簡介

set一般插入元素時,預設使用關鍵字型別的< 運算子來比較兩個關鍵字,故一般插入後為升序,但是針對自定義資料結構,如結構體,沒有< 運算子,故無法進行比較。針對自定義資料結構或者說自定義set排序規則有如下幾種方法:

方法一 過載<

在自定義結構體中過載< 則可以實現預設排序,示例程式碼如下:

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

執行結果如下:
這裡寫圖片描述

方法二 過載()

示例程式碼如下:

#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 來獲得一個函式指標型別時,必須加上一個* 來指出我們要使用一個給定函式型別的指標。用cmp 來初始化se物件,這表示當我們向se中插入元素時,通過呼叫cmp來為這些元素排序。可以使用cmp代替&cmp作為建構函式的引數,因為當我們使用一個函式的名字時,在需要的情況下會自動轉化為一個指標,使用&cmp 效果也是一樣的。

insertemplace 的使用

emplace對應insert,emplace_back對應於push_back;但是insertpush_back是直接將物件拷貝至容器當中,而emplaceemplace_back是先呼叫儲存物件建構函式,在記憶體中生成物件,然後拷貝至容器中。

相關推薦

C++ set定義排序

set簡介 set一般插入元素時,預設使用關鍵字型別的< 運算子來比較兩個關鍵字,故一般插入後為升序,但是針對自定義資料結構,如結構體,沒有< 運算子,故無法進行比較。針對自定義資料結構或

c++ set定義比較函式

set<char*>無法像set<string>一樣進行預設的排序操作,需要自己定義比較函式進行排序,例子如下: #include <stdio.h> #include "stdafx.h" #include<iostream> #incl

c++ map定義排序

在c++中用到map時,如果key是自定義的struct,那麼需要自己定義比較函式。因為只有基本型別有預設的比較方法。 typedef struct myKey { int nId; int nVersion; int nNote; }myKey; ///自定義ma

STL之Set定義排序

方法一、以類為比較器 struct classCompare { bool operator()(const int& lhs, const int& rhs) { return lhs < rhs ;

c++ 定義排序容器set

程式設計例項: #include <iostream> #include <set> #include <string> using namespace std; using std::set; struct MySetItem {

C++中關於set定義排序函式的書寫

大概有兩個月沒用過C++啦,手都變得很生了,在這裡,在這裡我想扯一下關於set的比較函式的定義,我想,應該有不少人對這個東西感到頭疼吧! 如果說我想在set裡面新增一個自定義的型別,比如說下面的結構體: struct Symbol { char

c/c++ 標準庫 set 定義關鍵字類型與比較函數

尖括號 ios template end 傳遞函數 使用 out 例子 比較 標準庫 set 自定義關鍵字類型與比較函數 問題:哪些類型可以作為標準庫set的關鍵字類型呢??? 答案: 1,任意類型,但是需要額外提供能夠比較這種類型的比較函數。 2,這種類型實現了 &l

.NET/C#中對定義物件集合進行定義排序的方法

一個集合可否排序,要看系統知不知道排序的規則,像內建的系統型別,int ,string,short,decimal這些,系統知道怎麼排序,而如果一個集合裡面放置的是自定義型別,比如自己定義了一個Car型別,要把它排序,系統是不知道怎麼辦的。 那麼,如何告知系統排序的規則

C/C++動態定義結構體陣列例項鍛鍊-學生成績排序

/************************************************************************/ /* 本程式是對動態記憶體、動態陣列、結構體、函式的綜合應用。 */ /***********************

c++ stl sort 定義排序函式cmp要遵循 strict weak ordering

   滿足strict weak ordering的運算子能夠表達其他所有的邏輯運算子(logical operator): <(a, b)  : (a < b) <=(a, b): !(b < a) ==(a, b): !(a <

c++的sort函式用lamda表示式定義排序

sort函式,可以自定義compare的方法或者過載>來完成自定義排序,而lamda表示式,也可以完成這個功能,測試程式碼如下:#include <iostream> #include <vector> #include <algorith

C++11 sort, vector, lambda——vector 定義排序

前言 std::sort大法好!很多情況下,快速排序是排序的不二選擇。#include < algorithm >中的 sort( ),完美的實現了這個快速排序。 std::vector大法好!很多情況下,vector是順序容器的不二選擇。#in

c#中 定義屬性 有 {get; set} 和沒有{get; set} 的區別

取值 public 之前 {} 的區別 一個 自動屬性 至少 定義 屬性:public int age{get;set;}    //自動屬性    public int age{} 這種編譯不通過,get和set至少有一個,分別代表,取值和賦值 變量:public i

C#之定義特性

創建 tip comm 字段 運算符 包含 自動 名稱 程序   在前面介紹的代碼中有使用特性,這些特性都是Microsoft定義好的,作為.NET Framework類庫的一部分,許多特性都得到了C#編譯器的支持。   .NET Frmework也允許定義自己的特性。自

[c#]Dll定義目錄

sku 百度 tar onf bind ati 文件 c# mas 做個項目用了一堆庫,放在根目錄下面亂七八糟的。昨天百度了幾下。感覺都沒說清楚。。今天找了大半天才知道原來。。。好吧我是菜鳥。因為剛剛把一個測試工程2.0轉4.0之後這個文件app.config才浮出來,只好

VS2017 Linux C++引用定義的動態庫

++ -1 undefined mage 編譯運行 linux下 lin 套路 log 前一篇博客講了用系統庫libpthread.so的例子,只需要在項目屬性頁的[C++->命令行參數]和[鏈接器->命令行參數]中加上對應參數(比如-pthread)即可,然後

java中實現Comparable接口實現定義排序

static -1 return rabl generated args logs ava sca 1 class Student implements Comparable{ 2 String name; 3 int gpa; 4 @Ov

織夢按權重排序定義排序

load ima row idt last 教程 syn 模板文件 而已 【按權重排序】 dede:list 的方法 1、找到"根目錄\include\arc.listview.class.php"文件。 2、修改代碼:在文件第727行處添加按weight排序判斷代碼(紅色

C#winform定義控件大全

orm cloc peter win form lai obb 全部 屬性 ood 對C# WinForm開發系列收集的控件使用方面進行整理, 加入了一些文章, 不斷補充充實, 完善這方面. 基礎 - 常用控件 C# WinForm開發系列 - CheckBox/

[LeetCode] Custom Sort String 定義排序的字符串

iou sort all out sorted abcd tput example bcd S and T are strings composed of lowercase letters. In S, no letter occurs more than once