自定義比較

常見

在上個章節我們介紹了 sort 函式,這個函式可以幫助我們對容器進行排序。不過先前的例子都是按照預設的排序方式,也就是升序排序,那能不能自訂排序方式呢?當然可以,sort 函式還提供了第三個非必填的參數,讓你能夠傳入一個自定義的比較函式來決定排序的方式。

比較函式

首先我們要先傳入一個自訂比較函式 cmp ,名子可以自訂:

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

接著就是撰寫比較函式。函式名稱必須跟傳入 sort 的一樣,並且回傳型態需要是 bool。這個函式會傳入兩個參數,分別是要比較的兩個值 aabb,你要回傳的布林值表示「 aa 是否需要排在 bb 前面」,根據回傳的數值讓 sort 決定是否交換值的位置。

bool cmp(int a, int b) {
    return a > b;
}

這個比較函式會讓 sort 進行降序排序。

內建的比較函式

像是升序排序、降序排序這種常見的排序方式,難道每次都要自己寫一遍比較函式嗎?當然不用!C++ 提供了一些內建的比較函式,讓你可以直接使用。

第一個就是 greater,這個函式會讓 sort 進行降序排序:

sort(v.begin(), v.end(), greater<int>());

greater 後面的角括號中要填入你要比較的資料型態,這邊我們填入 int,當然如果你想的話也可以填入其他的資料型態。比如說你要比較浮點數,就可以填入 double

sort(v.begin(), v.end(), greater<double>());

另外一個常見的比較函式是 less,這個函式會讓 sort 進行升序排序:

sort(v.begin(), v.end(), less<int>());

就像 greater 一樣,less 後面的角括號中也要填入你要比較的資料型態。

小測驗

比較函式 bool cmp(a, b) 的回傳值的意義是什麼?