C sort函式第三個引數的理解

2021-09-08 11:47:21 字數 2120 閱讀 7243

1.sort函式用法

c++reference中,最複雜的過載函式定義如下:
void sort (randomaccessiterator first, randomaccessiterator last, compare comp);
平時常用前兩個引數,分別代表需要排序的起始位置和終止位置,第三個引數是排序的規則,可以省略,此時就是預設排序規則(從小到大排列)

comp函式可以自己編寫,以適應不同的資料結構。比如要排列乙個結構體,採用降序排列

#include struct range

range(int a, int b):

};bool comp(range a, range b)//比較函式的返回值一定是bool型,並且入口引數暫時到現在是兩個,暫時沒有更高的需要情景,以後可以補充

vectorr(10,a);

sort(r.begin(), r.end(), comp);

也可以使用c++庫中已有的排序函式,在標頭檔案中,有equal_to、not_equal_to、greater、greater_equal、less、less_equal,可以直接作為comp函式

sort(a,a+100,greater());//降序排列

sort(a,a+100,less());//公升序排列

2.sort函式使用場合

不是所有的容器直接用sort函式的,有些容器自帶有sort函式,不能使用sort(name.begin(), name.end(), comp),只要用name.sort(comp)即可,比如list容器。

3.sort函式使用類內類外的區別

上面介紹的一直是sort函式在類外的使用方法。當sort函式在類內使用,並且定義comp函式也是類成員函式時,必須要在comp函式前加static,因為sort需要傳入的引數是乙個普通函式指標,而不是成員函式指標,所以需要在類成員定義前加static。如下

class trans

; listpoint;

int read_data(ifstream &ifs, list&point);

static bool comp(coordinate a, coordinate b);//加static

int sort_by_x(list&point);

int write_data(ofstream &ofs, listpoint, cstring cc_vc, int num);

public:

int trans_style(cstring inputpath, cstring outputpath, cstring cc_cv, int num);

};

其實這並不是sort函式規定的,而是所有的的普通類成員函式,都不能以函式指標的方式作為其他函式的入口引數,因為普通成員函式在編譯階段,會自動新增了入口引數,這樣這個函式指標的模板其實就改變了,比如舉個例子:

class c

int test()

;for (int i = 0; i < 10; i++)

cout << a[i] << endl;

sort(a, a + 10, compare);//在這裡就不需要對compare函式傳入引數了   

for (int i = 0; i < 10; i++)

cout << a[i] << endl;

return 0;}};

經過編譯以後,cmp函式變為如下形式:

bool compare(c *this, int a, int b)
而sort應該接收這樣bool compare(int a, int b)模板的函式指標,所以會編譯報如下的錯誤:

第乙個錯誤就是sort找不到接收bool compare(c *this, int a, int b)模板指標作為入口引數的函式模板

第二個錯誤就是不認為這邊compare是函式入口引數,而認為是函式呼叫,所以缺少函式列表。

而靜態成員函式是沒有this指標的,所以可以使用。

這篇文章可以作為參考,原理是一樣的:

setTimeout的第三個引數

settimeout函式有三個引數 fn 必傳 需要執行的函式 time 非必傳 傳值時 倒計時time毫秒後執行fn 不傳時 預設為0,fn在最早可得的空閒時間執行,在 任務佇列 的尾部執行fn,因此要等到同步任務和 任務佇列 現有的事件都處理完,才會得到執行。param 非必傳 fn函式的引數 ...

sort函式中的第三個引數

在寫poj2421之前看了別人的 裡面這段我開始不明白!sort amount,amount counter,cmp 下面這段 是我在別處摘抄的,希望之前不明白的朋友能仔細的看看。sort的第三個引數,一直是用仿函式,沒有想到用函式指標也可以 sort的第三個引數可以用函式指標也可以用仿函式。用函式...

c sort函式三個引數解釋

vector.begin 起點 或者其他位置 vector.end 終點 或者其他位置 對於一些複雜的結構 比如pair 我們需要定義排序規則 sort algorithm example include std cout include std sort include std vector us...