stl容器的排序,支援隨機訪問的容器vector,deque,string沒有sort成員,可呼叫std::sort排序;list排序呼叫自帶的list::sort。
下面是std::sort函式,有兩個版本:
template void sort ( randomaccessiterator first, randomaccessiterator last );
template 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(大於等於)
當容器元素為內建型別時可以使用,注意使用的格式,要加模版引數(由於是模板類)和後面的(),如下:
sort(vec.begin(), vec.end(), less());
對於復合型別,實現排序方式有3種方法:
1)過載operator《操作符
2)寫全域性的比較函式
3)寫仿函式,過載operator()形式為:bool operator()(const 類名& 引數)
下面看看這3種方法的實現:
// 排序元素,比較的物件
struct person
int id_;
string name_;
int age_;
};
// 方式1:過載operator《用於排序時的比較(寫在函式體內)
bool operator< (const person& rt)
// 排序函式寫法,預設呼叫operator<
sort(members.begin(), members.end());
// 方式2:寫比較函式
bool compage(const person& pl, const person& pr)
// 排序時傳入比較函式指標
sort(members.begin(), members.end(), compage);
// 方式3:仿函式
struct compname
};// 排序時傳入函式物件
sort(members.begin(), members.end(), compname());
用函式物件代替函式指標的優點:
1. 函式物件可以儲存中間結果在資料成員中,而函式想要存中間結果須要設全域性變數或靜態變數,這個是我們不想要的。
2. 在函式物件中編譯器可以實現內聯呼叫,從而提公升效能。
下面看乙個函式物件的擴充套件應用
// 利用函式物件實現公升降排序
struct compnameex
bool operator()(const person& pl, const person& pr)
private:
bool asce_;
};// 使用仿函式排序(公升降序)
sort(members.begin(), members.end(), compnameex(false));
注意:如果是指標的容器,比較函式的引數也應是指標。 STL(排序演算法sort)
標頭檔案 include 1.對基本型別的陣列從小到大排序 sort 陣列名 n1,陣列名 n2 n1和n2都是int型別的表示式,可以包含變數 如果n1 0,則 n1可以不寫 將陣列中下標範圍為 n1,n2 的元素從小到大排序 如 int a sort a,a 7 對整個陣列從小到大排序 int ...
STL排序演算法sort
要使用stl中的演算法,需要在程式標頭檔案引入 include 1.對基本型別的陣列從小到大排序 sort 陣列名 n1,陣列名 n2 n1和n2都是int型別的表示式,可以包含變數 如果n1 0,則 n1可以不寫 將陣列中下標範圍為 n1,n2 的元素從小到大排序。下標為n2的元素不在排序區間內 ...
STL排序演算法sort
sort 陣列名 n1,陣列名 n2 注意排序區間是 n1,n2 左閉右開。預設為從小到大排序,如果想要從大到小排序,需要加引數sort 陣列名 n1,陣列名 n2,greater include includeusing namespace std int main sort a,a 5 for ...