1. 程式人生 > >C++ sort 排序(降序、升序)使用總結

C++ sort 排序(降序、升序)使用總結

一、升序

    C++ sort 函式十分方便,可以對內建型別也可對自定義型別進行快速排序,內建型別的使用比較簡單,下面主要討論自定義型別的排序,一般有如下幾種使用方法:

1.1 過載比較操作符

    比如,我們現有一批學生,要根據他們的成績進行升序排序,成績如果相等則根據名字升序排序,那麼我們可以如下操作:

struct Student{
    string name;
    int grade;

    Student(string name, int grade) : name(name), grade(grade){}

    bool operator < (const Student& rhs) const{
        return grade < rhs.grade
        || (grade == rhs.grade && name < rhs.name);
    }

    friend void operator << (ostream& output, const Student& s){
        output << s.name << " " << s.grade << endl;
    }
};
int main()
{
    vector<Student> vec;

    vec.emplace_back("Jack", 20);
    vec.emplace_back("John", 30);
    vec.emplace_back("Amy", 20);
    vec.emplace_back("Bill", 90);

    cout << "Before:" << endl;
    for(auto& s : vec){
        cout << s;
    }

    sort(begin(vec),end(vec));

    cout << endl << "After:" << endl;
    for(auto& s : vec){
        cout << s;
    }

    return 0;
}

    執行結果如下圖:

1.2 比較函式

    當然,我們也可以自己寫比較函式,實現如下:

bool cmp(const Student& lhs, const Student& rhs){
    return lhs.grade < rhs.grade
    || (lhs.grade == rhs.grade && lhs.name < rhs.name);
}

    按如下方式呼叫:
sort(begin(vec),end(vec), cmp);

1.3 函式物件

    另外一種方式,即構造一個函式物件,抑或叫 functor,其實就是實現了過載 operator() 的一個類,程式碼如下:

struct Compare{
    bool operator()(const Student& lhs, const Student& rhs){
        return lhs.grade < rhs.grade
        || (lhs.grade == rhs.grade && lhs.name < rhs.name);
    }
};

    按如下方式呼叫:
sort(begin(vec),end(vec), Compare());

1.4 Lambda

    C++11有了 Lambda 之後,就不必再為某些小函式寫具名函數了,如下使用即可:

sort(begin(vec), end(vec), [](const Student& lhs, const Student& rhs) {
				return lhs.grade < rhs.grade 
				    || (lhs.grade == rhs.grade && lhs.name < rhs.name); });

二、降序

    降序排序的方法與升序類似,如果採用比較函式、Lambda 或者比較函式的方式,只需要改一改比較條件就OK了,但是,如果對於Student類,我們定義了 operator < 之後,不想為了降序排序再定義一個 operator > 怎麼辦?兩種辦法!

2.1 reverse

    升序排序之後,用 reverse 反轉即可。

2.2 反向迭代

    直接按如下方式呼叫即可,不用再去過載 operator >

sort(vec.rbegin(), vec.rend());

相關推薦

C++ sort 排序升序使用總結

一、升序     C++ sort 函式十分方便,可以對內建型別也可對自定義型別進行快速排序,內建型別的使用比較簡單,下面主要討論自定義型別的排序,一般有如下幾種使用方法: 1.1 過載比較操作符  

關於c++字串的 sort排序字典

char: #include<algorithm> #include<cstring> #include<cstdio> #define M 100000 #de

吳恩達機器學習十二主成分分析PCA

目錄 0. 前言 學習完吳恩達老師機器學習課程的降維,簡單的做個筆記。文中部分描述屬於個人消化後的理解,僅供參考。 如果這篇文章對你有一點小小的幫助,請給個關注喔~我會非常開心的~ 0. 前言 資料的特徵數量,又稱作向量的維度。降維(dimens

C++面經網際網路後臺嵌入式

找工作的心路歷程,四個字總結,厚積薄發 這一年我堅持的事情有兩個: 堅持寫部落格 堅持看書,刷題 一開始寫部落格呢,是為了做筆記,後來也會在意訪問量啊,排名啥的。但不管是什麼原因,只要開始寫了,就停不下來,分享就是收穫。自己也搭過個人部落格,但是維護起

向TreeSet集合中加入5個員工的物件,根據員工的年齡升序進行排序,若年齡相同,再根據 工齡排序,若工齡相同,根據薪水排序

題目要求:         向TreeSet集合中加入5個員工的物件,根據員工的年齡(升序)進行排序,若年齡相同,再根據  工齡(降序)來排序,若工齡相同,根據薪水(降序)排序 分析一下? 我想還是不用了,題目已經給的很清晰了。就是一個員工類Employee   一個測試

陣列排序升序 倒排

 倒排: var a=[1,2,3,4,8,7,6]; var arr=[]; for(var i=a.length-1;i>=0;i--){ arr.push(a[i]) } console.log(arr)  排序:氣泡排序 var arr=[1,3

章節號比較排序A.1B.2.1C.4

java 章節號 排序 private static int compareSerialNum(String str1,String str2){ if(str1.equals(str2)){ return 0; } if(!str1.contains(".")&

C程式設計--排序冒泡選擇插入--插入

演算法排序 個人說明:排序的演算法有許多種,該部落格只是列舉了部分常用的排序方式,以供參考。程式使用語言為C語言。 3.插入排序法 基本思想: 在要排序的一組數中,假設前面(n-1)[n>=2] 個數已經是排好順序的,現在要把第n個數插到前面的有序數中,使得這n

C程式設計--排序冒泡選擇插入--選擇

演算法排序 個人說明:排序的演算法有許多種,該部落格只是列舉了部分常用的排序方式,以供參考。程式使用語言為C語言。 2.選擇排序法 基本思想: 1.在要排序的一組數中,選出最小的一個數與第一個位置的數交換; 2.然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴

C程式設計--排序冒泡選擇插入--冒泡

演算法排序 個人說明:排序的演算法有許多種,該部落格只是列舉了部分常用的排序方式,以供參考。程式使用語言為C語言。 1.氣泡排序法 基本思想:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上

C# 引數按照ASCII碼從小到大排序字典

在對接第三方支付的時候,第三方會要求引數按照ASCII碼從小到大排序。如下: 1 public static void requestPay() 2 { 3 Dictionary<string, string> dics = new Dictionary<s

C# 參數按照ASCII碼從小到大排序字典

sna request order bstr 三方 end select sta each 在對接第三方支付的時候,第三方會要求參數按照ASCII碼從小到大排序。如下: 1 public static void requestPay() 2 { 3

C程式設計--排序冒泡選擇插入

演算法排序 個人說明:排序的演算法有許多種,該部落格只是列舉了部分常用的排序方式,以供參考。程式使用語言為C語言。 1.氣泡排序法 基本思想:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較

資料結構(1) 線性表技巧及應用:字首和排序對求法之一

雖然線性表實在過於簡單,幾乎不會有大佬寫它的應用 但是作為一個菜雞的我還是打算歸納總結一下線性表一些應用和技巧 1.字首和 emmmm 我們來看這樣一個問題 已知一個序列s[ i ] (1<=i<=n),有m個請求,每個請求為兩個整數a,b(1<=a<=b&l

二叉樹C++ | 深度優先遍歷_3

深度優先遍歷 /* Binary Tree Traversal - Preorder, Inorder, Postorder */ #include<iostream> using namespace std; struct Node { char data; struct

函式指標作為函式引數,實現氣泡排序升序排序排序

#include<stdio.h> #define N 10//定義陣列元素個數 int Ascending(int a,int b);//升序排列的函式宣告 int Descendin

升序 的區別,就在於這個

int console emp using lda con esp ++ 升序 原文發布時間為:2009-03-18 —— 來源於本人的百度文章 [由搬家工具導入]原理:升序和降

【樹】二叉樹遍歷算法深度優先廣度優先遍歷,前層次及Java實現

order new link left 算法 很多 == 都是 off 二叉樹是一種非常重要的數據結構,很多其它數據結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有深度遍歷和廣度遍歷,深度遍歷有前序、中序以及後序三種遍歷方法,廣度遍歷即我們平常所說的層次遍歷。因為樹的定義

C#入門面向對象編程字段屬性

賦值 字段與屬性 業務 現實 命名 概述 直接 開發經驗 可能 一、訪問修飾符 1、為什麽使用訪問修飾符: (1)現實中:每個人都有自己的隱私和公開內容。 (2)開發中:有時候開發者在設計類的時候,一些成員(字段、屬性、方法)無需提供給調用者 (3)好處:充分體現面向對象裏

C++實現利用和中生成二叉樹以及二叉樹的鏡像

lse pub 非遞歸 ace 方法 [] reorder spa push #include<iostream> #include<string.h> #include<stack> using namespace std; type