C++使用sort對容器排序的實現(xiàn)
本文主要解決以下問題
- STL中sort的使用方法
- 使用sort對vector的排序
- 使用sort對map排序
- 使用sort對list排序
STL中sort的使用方法
C++ STL 標準庫中的 sort() 函數(shù),本質(zhì)就是一個模板函數(shù)。該函數(shù)專門用來對容器或普通數(shù)組中指定范圍內(nèi)的元素進行排序,排序規(guī)則默認以元素值的大小做升序排序,除此之外我們也可以選擇標準庫提供的其它排序規(guī)則(比如std::greater降序排序規(guī)則),甚至還可以自定義排序規(guī)則。
值得一提的是,sort() 函數(shù)位于頭文件中,因此在使用該函數(shù)前,程序中應(yīng)包含如下語句:
#include <algorithm>
sort() 函數(shù)有 2 種用法,其語法格式分別為:
//對 [first, last) 區(qū)域內(nèi)的元素做默認的升序排序 void sort (RandomAccessIterator first, RandomAccessIterator last); //按照指定的 comp 排序規(guī)則,對 [first, last) 區(qū)域內(nèi)的元素進行排序 void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
其中,first 和 last 都為隨機訪問迭代器,它們的組合 [first, last) 用來指定要排序的目標區(qū)域;另外在第 2 種格式中,comp 可以是 C++ STL 標準庫提供的排序規(guī)則(比如 std::greater),也可以是自定義的排序規(guī)則。
數(shù)組排序樣例:
#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 標準庫提供的排序規(guī)則
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時,幾乎可以視作是在操作數(shù)組,可以將vector看作對數(shù)組的封裝。因此,使用sort對vector進行排序時完全可以遵循上面使用sort對數(shù)組的排序方法。
一維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排序。數(shù)組保存一系列的坐標,先按照第二維進行升序排列,再按照第一維升序排列
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>鍵值對的數(shù)據(jù)結(jié)構(gòu),可以很方便快速的根據(jù)key查到相應(yīng)的value,map本身的實現(xiàn)方式內(nèi)含了比較器的設(shè)置,只要我們在map初始化的時候傳入比較器,即可完成對應(yīng)的排序。
定義包含水果及其個數(shù)的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 */
定義包含水果及其個數(shù)的map,按照水果個數(shù)進行排序,當水果個數(shù)相同時,按照水果名稱字典序排序 (將map轉(zhuǎn)為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() 函數(shù)模板定義在頭文件 algorithm 中,要求使用隨機訪問迭代器。但 list 容器并不提供隨機訪問迭代器,只提供雙向迭代器,因此不能對 list 中的元素使用 sort() 算法。但是,還是可以進行元素排序,因為 list 模板定義了自己的 sort() 函數(shù)。sort() 有兩個版本:無參 sort() 函數(shù)將所有元素升序排列。第二個版本的 sort() 接受一個函數(shù)對象或 lambda 表達式作為參數(shù),這兩種參數(shù)都定義一個斷言用來比較兩個元素。
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 */
參考文獻
到此這篇關(guān)于C++使用sort對容器排序的實現(xiàn)的文章就介紹到這了,更多相關(guān)C++ sort對容器排序 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言類型轉(zhuǎn)換與常量的細節(jié)深入理解探究
這篇文章主要為大家介紹了C?語言類型轉(zhuǎn)換與常量的細節(jié)深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12C語言數(shù)組和指針,內(nèi)存之間的關(guān)系
這篇文章主要介紹了C語言數(shù)組和指針,內(nèi)存之間的關(guān)系,首先論證一維數(shù)組和一級指針之前的關(guān)系,我們常常使用一級指針指針的方式訪問一維數(shù)組,只有對內(nèi)存的理解到位才能理解它們直接的關(guān)系。需要的小伙伴可以參考一下2022-02-02C語言中((type *)0) 和(type *0)區(qū)別小結(jié)
((type *)0)?和?(type *0)?在 C 和 C++ 中有不同的含義和用途,本文主要介紹了C語言中((type *)0) 和(type *0)區(qū)別,具有一定的參考價值,感興趣的可以了解一下2024-08-08VSCode 配置C++開發(fā)環(huán)境的方法步驟
這篇文章主要介紹了VSCode 配置C++開發(fā)環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03