3種方法實現比較

2021-08-20 04:34:08 字數 2746 閱讀 8699

stl排序之sort函式

2023年07月26日 23:26:24

閱讀數:33036

stl容器的排序,支援隨機訪問的容器vector,deque,string沒有sort成員,可呼叫std::sort排序;list排序呼叫自帶的list::sort。

下面是std::sort函式,有兩個版本:

[cpp] 

view plain

copy

template

<

class

randomaccessiterator>  

void

sort ( randomaccessiterator first, randomaccessiterator last );  

template

<

class

randomaccessiterator, 

class

compare>  

void

sort ( randomaccessiterator first, randomaccessiterator last, compare comp );  

sort函式有以下特徵:

1. 要求輸入乙個範圍[first, last)

2. 隨機迭代器,能用此演算法的容器是支援隨機訪問的容器:vector, deque, string。

3.第乙個版本使用operator《進行比較,預設公升序排序,第二個版本使用comp做比較.

關於引數comp,comp帶兩個同型別的引數,如果第乙個引數排在第二個引數前面,返回true,否則返回false

它可以是函式指標,也可以是函式物件。函式指標好理解,何謂函式物件?

函式物件(function object),是過載了operator()函式的類(或結構體)例項化出來的物件,使用起來像函式,又叫仿函式。

stl本身提供了幾個比較函式,下面這些都是仿函式:

less(小於)

greater(大於)

equal_to(等於)

not_equal_to(不相等)

less_equal(小於等於)

greater_equal(大於等於)

當容器元素為內建型別時可以使用,注意使用的格式,要加模版引數(由於是模板類)和後面的(),如下:

[cpp] 

view plain

copy

sort(vec.begin(), vec.end(), less<

int>());  

對於復合型別,實現排序方式有3種方法:

1)過載operator《操作符

2)寫全域性的比較函式

3)寫仿函式,過載operator()形式為:bool operator()(const 類名& 引數)

下面看看這3種方法的實現:

[cpp] 

view plain

copy

// 排序元素,比較的物件

struct

person  

intid_;  

string name_;  

intage_;  

};  

[cpp] 

view plain

copy

// 方式1:過載operator《用於排序時的比較(寫在函式體內)

bool

operator< (

const

person& rt)  

// 排序函式寫法,預設呼叫operator<

sort(members.begin(), members.end());  

[cpp] 

view plain

copy

// 方式2:寫比較函式

bool

compage(

const

person& pl, 

const

person& pr)  

// 排序時傳入比較函式指標

sort(members.begin(), members.end(), compage);  

[cpp] 

view plain

copy

// 方式3:仿函式

struct

compname  

};  

// 排序時傳入函式物件

sort(members.begin(), members.end(), compname());  

用函式物件代替函式指標的優點:

1. 函式物件可以儲存中間結果在資料成員中,而函式想要存中間結果須要設全域性變數或靜態變數,這個是我們不想要的。

2. 在函式物件中編譯器可以實現內聯呼叫,從而提公升效能。

下面看乙個函式物件的擴充套件應用

[cpp] 

view plain

copy

// 利用函式物件實現公升降排序

struct

compnameex  

bool

operator()(

const

person& pl, 

const

person& pr)  

private

:  bool

asce_;  

};  

// 使用仿函式排序(公升降序)

sort(members.begin(), members.end(), compnameex(false

));  

注意:如果是指標的容器,比較函式的引數也應是指標。

Fibonacci 實現的3種方法

斐波那契數列,又稱 分割數列,指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 定義如下 第一種方法 在當初第一次接觸遞迴的時候,例子就是fibonacci數的計算。實現 如下 long long fibonacci1 int n 第二種方法 通過使用兩個額外的空間換取時間的方法來改善第一...

Java實現多執行緒的3種方法

方法一 class thread1 extends thread public void run 在你想要啟動執行緒的地方 thread1 mynewthread new thread1 mynewthread.start 方法二 public class classtorun implements...

3種方法實現隨機驗證碼

1 由4個字元組成的字串 2 4個字元是隨機的數字 大小寫字母 3 4個字元的字型是隨機的,並且顏色,大小都是隨機的 4 同時,字型也是傾斜的 1 在這裡,我們要用到 random 這個隨機函式物件 2 那麼該如何來使用random呢?rabdom 既然是個函式物件,那麼,它肯定是先建立 例項化這個...