C sort與比較器

2022-09-14 19:00:13 字數 1847 閱讀 6508

c++內建乙個排序函式:sort,其標頭檔案為#include,函式原型為:

void sort (randomaccessiterator first, randomaccessiterator last, compare comp);
需要三個引數:

起始位置(迭代器),參與排序的第乙個元素的位址

結束位置(迭代器),參與排序的最後乙個元素的後乙個元素的位址

比較器(函式指標),此引數可以省略,省略後自動使用「less<>」結構體按公升序排序,而該結構體只依賴於「 operator< 」,即《號 。因此,參與排序的元素必須具有 「 < 」,要麼是int,double等自帶的

可省略比較器的示例:

以下僅演示過載 < 的情況,自帶 < 過於簡單不必贅述。

using

namespace

std;

struct

node

};void

test01()

intmain()

結果如下:

如果我們不想給指定型別過載

//

自定義函式,降序

bool mycmp(const node& a,const node&b)

sort改為:

sort(v.begin(), v.end(), mycmp);

mycmp是指向mycmp()函式的指標,直接作為比較器。

//

偽函式,降序

struct

mycmp2

};

sort改為:

sort(v.begin(), v.end(), mycmp2());
mycmp2是結構體,mycmp2()作為比較器。

結果如下:

一般定義在類或結構體外部(理論上寫在內部的也可以通過函式指標取到位址並作為比較器,但暫且沒找到正確寫法)

返回型別必須是bool

傳入引數必須為2個。我們只希望sort對元素進行排序,排序過程中不能對值產生影響,所以一般用const修飾傳入引數。同時,為加快速度,一般傳引用

如何按需求編寫比較器?記住如下規則:當返回true時,排序後第乙個傳參會排在前面,第二個傳參排在後面;返回false時,排序後第二個傳參排在前面,第乙個排在後面。也可以這樣理解:對於乙個容器,從前往後取數,每次取相鄰兩個,傳給比較器進行比較,每次結果都是true,則該容器是正確排序的容器。

例如:我們希望按x的降序對node型元素排序,也就是說需求如下:a.x < b.x 時將b排在a前面,而a.x > b.x時,將a排在b前面,對於=的情況沒有要求,根據規則編寫如下:

bool mycmp(const node& a,const node&b) 

a.x > b.x時返回true,則排序後第乙個傳參a排在前面,第二個傳參b排在後面;

a.x<=b.x時返回false,則排序後第二個傳參b排在前面,第乙個傳參a排在後面,滿足需求

避坑:

優先佇列priority_queue底層是堆,比較器比較的物件是從葉子到根的元素,因此最後自動排序出來的順序是反直覺的。例如

priority_queue ,less >q;
該優先佇列是大根堆,按降序排列

索引器 索引器與陣列屬性的比較

url 索引器 indexer 索引器允許類或結構的例項按照與資料相同的方式進行索引。索引器類似於屬性,不同之處在於它們的訪問器採用引數。所以索引器也被稱為有參屬性。示例一 using system class arrclass 沒有索引器的類 public string name class in...

閉包與比較器(go語言)

寫在前面的話 二者沒有什麼關係哈,只是剛好遇到了寫兩篇又費事 閉包有什麼用?1.函式裡變數的作用域是在函式執行完就 game over 的,那如何讓乙個函式的變數可以被儲存住呢?你可以使用全域性變數,但是這存在所謂的 汙染 也就是 不優美了,hhh 2.除了能夠讓函式裡的變數生命週期發生改變,還有一...

索引器與陣列 屬性的比較

索引器 indexer 索引器允許類或結構的例項按照與資料相同的方式進行索引。索引器類似於屬性,不同之處在於它們的訪問器採用引數。所以索引器也被稱為有參屬性。索引器與陣列的比較 1 索引器的索引值 index 型別不受限為整數 用來訪問陣列的索引值 index 其型別一定為整數,然而索引器可以定義其...