介紹
-
C++的一個重要組成部分STL(Standard Template Library),即標准模板庫,是一些高級數據結構和算法的集合:高級數據結構(容器)主要包括list、set、vector、map等,這些會在后面的學習中介紹。STL中還包括一些常用的算法,如排序、查找等。
-
這些高級數據結構和算法的集合是世界上很多聰明人的傑作。STL的目的是標准化組件,這樣就不用重新開發,可以使用現成的組件。STL現在是C++的一部分,因此可以直接使用。
-
在NOI系列的比賽中,允許使用STL。
-
為了提高編程效率,要盡量使用STL中提供的容器和算法,以避免不必要的低效率、重復編碼。
-
本文介紹使用STL中的sort函數進行排序
sort函數:2參數用法##
以下代碼實現了數組的升序排序
#include<algorithm> //sort函數由庫<algorithm>提供,需要加載頭文件
#include<iostream>
using namespace std;
int main(){
int a[10]={3, 1, 4, 1, 5, 9, 2, 6, 7, 0};
sort(a+0, a+10); //對sort的10個元素進行升序排序
for(int i=0; i<10; i++)
cout<<a[i]<<' ';
return 0;
}
-
第一個參數為排序范圍的起始地址,第二個參數為排序范圍的結束地址,但不包含該結束地址上的元素。可以理解為該范圍定義了一個半開半閉區間:[m, n)
-
該函數屬於同樣可應用於char,float,double,bool等類型的數組。
sort函數:3參數用法##
由於sort的兩參數用法僅能實現升序排列,有時,我們需要降序或者按照自定義的方式進行排序,例如按照數字位數的多少進行排序。這時可以使用sort函數的3參數用法,在2參數的基礎上增加了一個參數:自定義函數。
以下代碼實現了數組的降序排序
#include<algorithm> //sort函數由庫<algorithm>提供,需要加載頭文件
#include<iostream>
using namespace std;
//自定義比較函數cmp
bool cmp(const int & A, const int & B){
return A>B; //如果修改為return A<B就還原為了升序排列
}
int main(){
int a[10]={3, 1, 4, 1, 5, 9, 2, 6, 7, 0};
sort(a+0, a+10, cmp); //對sort的10個元素進行降序排序
for(int i=0; i<10; i++)
cout<<a[i]<<' ';
return 0;
}
自定義函數的本質是制定了一個對象A、B的比較規則,sort函數按照這個規則進行比較,從而完成排序。
sort函數:用於自定義的結構體類型數組
我們自定義的結構體類型數組同樣可以使用sort進行排序,當然,由於自定義類型對象沒有默認的比較規則,你必須使用三參數的sort函數,自定義一個函數來說明比較規則,看下面例題:
有N個學生的成績需要進行排序,輸入的每行信息包括“姓名”,“分數”,姓名是由無空格的英文組成。要求按照如下規則排序:成績為第一排序條件,成績相同的情況下,姓名按照字典先后順序排列,輸出為N行,每行一組姓名和分數
代碼實現
#include<algorithm> //sort函數由庫<algorithm>提供,需要加載頭文件
#include<iostream>
#include<cstring>
using namespace std;
struct STU{ //自定義結構體類型STU
char name[50];
int score;
}s[100]; //STU類型數組s
//自定義比較函數cmp說明比較規則
bool cmp(const STU & A, const STU & B){
if(A.score>B.score) return true;
if(A.score<B.score) return false;
if(strcmp(A.name, B.name)<0) return true;
return false;
}
int main(){
int N;
cin>>N;
for(int i=0; i<N; i++)
cin>>s[i].name>>s[i].score;
sort(s, s+N, cmp); //使用sort排序
for(int i=0; i<N; i++)
cout<<s[i].name<<" "<<s[i].score<<endl;
return 0;
}