本文主要解決以下問題
- STL中sort的使用方法
- 使用sort對vector的排序
- 使用sort對map排序
- 使用sort對list排序
STL中sort的使用方法
C++ STL 標準庫中的 sort() 函式,本質就是一個模板函式。該函式專門用來對容器或普通陣列中指定範圍內的元素進行排序,排序規則預設以元素值的大小做升序排序,除此之外我們也可以選擇標準庫提供的其它排序規則(比如std::greater
值得一提的是,sort() 函式位於
#include <algorithm>
sort() 函式有 2 種用法,其語法格式分別為:
//對 [first, last) 區域內的元素做預設的升序排序
void sort (RandomAccessIterator first, RandomAccessIterator last);
//按照指定的 comp 排序規則,對 [first, last) 區域內的元素進行排序
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
其中,first 和 last 都為隨機訪問迭代器,它們的組合 [first, last) 用來指定要排序的目標區域;另外在第 2 種格式中,comp 可以是 C++ STL 標準庫提供的排序規則(比如 std::greater
陣列排序樣例:
#include <algorithm>
#include <algorithm>
using namespace std;
int main(){
int arr[] = {2,6,3,5,4,8,1,0,9,10};
sort(arr, arr+10);
for(int i = 0;i < 10;i++)
cout << arr[i] << " ";
}
// out
/*
0 1 2 3 4 5 6 8 9 10
*/
使用 STL 標準庫提供的排序規則
int main(){
int arr[] = {2,6,3,5,4,8,1,0,9,10};
sort(arr, arr+10, std::greater<int>());
for(int i = 0;i < 10;i++)
cout << arr[i] << " ";
cout << endl;
sort(arr, arr+10, std::less<int>());
for(int i = 0;i < 10;i++)
cout << arr[i] << " ";
}
// out
/*
10 9 8 6 5 4 3 2 1 0
0 1 2 3 4 5 6 8 9 10
*/
使用自定義比較器
bool cmp(const int a, const int b){
return a < b;
}
int main(){
int arr[] = {2,6,3,5,4,8,1,0,9,10};
sort(arr, arr+10, cmp);
for(int i = 0;i < 10;i++)
cout << arr[i] << " ";
}
// out
/*
0 1 2 3 4 5 6 8 9 10
*/
使用 lambda 表示式自定義比較器
int main(){
int arr[] = {2,6,3,5,4,8,1,0,9,10};
sort(arr, arr+10, [](const int a, const int b){
return a < b;
});
for(int i = 0;i < 10;i++)
cout << arr[i] << " ";
}
// out
/*
0 1 2 3 4 5 6 8 9 10
*/
使用sort對vector的排序
在 C++ 中幾乎操作vector時,幾乎可以視作是在運算元組,可以將vector看作對陣列的封裝。因此,使用sort對vector進行排序時完全可以遵循上面使用sort對陣列的排序方法。
一維vector排序
int main(){
vector<int> vec = {2,6,3,5,4,8,1,0,9,10};
sort(vec.begin(), vec.end());
for(int item: vec)
cout << item << " ";
return 0;
}
// out
/*
0 1 2 3 4 5 6 8 9 10
*/
二維vector排序。陣列儲存一系列的座標,先按照第二維進行升序排列,再按照第一維升序排列
int main(){
vector<vector<int>> vvi = {{9,1}, {2,3}, {8,7}, {6,2}, {5,2}};
sort(vvi.begin(), vvi.end(), [](const vector<int>& v1, const vector<int>& v2){
if(v1[1] < v2[1]) return true;
else if(v1[1] == v2[1]) return v1[0] < v2[0];
else return false;
});
for(vector<int> v: vvi){
for(int item: v){
cout << item << " ";
}
cout << endl;
}
return 0;
}
// out
/*
9 1
5 2
6 2
2 3
8 7
*/
使用sort對map排序
map是用來存放<key, value>鍵值對的資料結構,可以很方便快速的根據key查到相應的value,map本身的實現方式內含了比較器的設定,只要我們在map初始化的時候傳入比較器,即可完成對應的排序。
定義包含水果及其個數的map,按照水果名稱字典序進行排序 (按key排序)
#include<map>
using namespace std;
int main(){
map<string, int, less<string>> msi;
msi["apple"] = 5;
msi["watermelon"] = 2;
msi["pear"] = 3;
msi["peach"] = 6;
msi["cherry"] = 10;
for(auto item: msi)
cout << item.first << " " << item.second << endl;
return 0;
}
// out
/*
apple 5
cherry 10
peach 6
pear 3
watermelon 2
*/
定義包含水果及其個數的map,按照水果個數進行排序,當水果個數相同時,按照水果名稱字典序排序 (將map轉為vector進行排序)
bool cmp(const pair<string, int>& a, const pair<string, int>& b){
if(a.second < b.second) return true;
else if(a.second == b.second) return a.first < b.first;
else return false;
}
int main(){
map<string, int> msi;
msi["apple"] = 5;
msi["watermelon"] = 2;
msi["pear"] = 3;
msi["peach"] = 5;
msi["cherry"] = 10;
vector<pair<string, int>> vpi(msi.begin(), msi.end());
sort(vpi.begin(), vpi.end(), cmp);
for(auto item: vpi){
cout << item.first << " " << item.second << endl;
}
return 0;
}
// out
/*
watermelon 2
pear 3
apple 5
peach 5
cherry 10
*/
使用sort對list排序
sort() 函式模板定義在標頭檔案 algorithm 中,要求使用隨機訪問迭代器。但 list 容器並不提供隨機訪問迭代器,只提供雙向迭代器,因此不能對 list 中的元素使用 sort() 演算法。但是,還是可以進行元素排序,因為 list 模板定義了自己的 sort() 函式。sort() 有兩個版本:無參 sort() 函式將所有元素升序排列。第二個版本的 sort() 接受一個函式物件或 lambda 表示式作為引數,這兩種引數都定義一個斷言用來比較兩個元素。
list排序示例
int main(){
list<string> ls = {"one", "two", "three"};
ls.sort([](const string& a, const string& b){
return a < b;
});
for(string item: ls) cout << item << " ";
return 0;
}
// out
/*
one three two
*/