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 既然是個函式物件,那麼,它肯定是先建立 例項化這個...