詳解C++ sort函數(shù)的cmp參數(shù)
前言:
學(xué)算法的第一天你在學(xué)冒泡、桶排
在你還沒搞明白快排和歸并的時候
你已經(jīng)學(xué)到了數(shù)據(jù)結(jié)構(gòu)最后的堆排序和希爾排序
可以說排序是很多競賽生的噩夢……
于是它誕生了
void std::sort() Sort the elements of a sequence using a predicate for comparison. 參數(shù): __first – An iterator. __last – Another iterator. __comp – A comparison functor.
針對一個地址區(qū)間完成排序,算法每次自動選擇,以快排為主
C++需要頭文件#include <algorithm>
(當(dāng)然萬能頭我也沒意見)
1、升序排序
最簡單的就是用它完成int類型升序排序
Copy Line-numbers language-cpp #include <iostream> #include <algorithm> using namespace std; int main() { int a[5] = {2, 1, 3, 5, 4}; sort(a, a + 5); for (int i = 0; i < 5; i++) cout << a[i] << " "; }
輸出如下,很簡單
1 2 3 4 5
這里傳入給sort的參數(shù) a
和 a + 5
都是地址,和大多數(shù)編程語言一樣,這里遵循左閉右開原則,即函數(shù)實(shí)際會讀取和操作的五個地址如下:
a + 0 a + 1 a + 2 a + 3 a + 4
2、降序排序
如果需要降序排序,程序如下
#include <iostream> #include <algorithm> using namespace std; bool cmp(int x, int y){ return x > y; } int main() { int a[5] = {2, 1, 3, 5, 4}; sort(a, a + 5, cmp); for (int i = 0; i < 5; i++) cout << a[i] << " "; }
輸出:
5 4 3 2 1
我們多寫了一個bool類型的cmp函數(shù),并將其地址作為第3個參數(shù)傳給了sort
cmp可以替換其內(nèi)置的函數(shù)來判斷究竟該讓哪些元素在前哪些元素在后
很多小伙伴可能有個疑惑:如何從實(shí)質(zhì)上理解cmp函數(shù),或者說我究竟該怎么記住cmp怎么寫呢?
我們來看這三個點(diǎn):
- 毋庸置疑,cmp函數(shù)返回bool類型,表示當(dāng)前排序是否正確(具體見3)
- cmp函數(shù)應(yīng)接受兩個參數(shù),類型與要排序的數(shù)組相同(可以是int、short和long long這些常見類型,當(dāng)然也可以是結(jié)構(gòu)體)
cmp返回值的實(shí)際意義是傳入a、b兩個參數(shù),a在前b在后的排序是否是正確的,若是正確的返回1(true),否則返回0(false)
那么我們再看一個結(jié)構(gòu)體的排序?qū)嵗?/p>
3、結(jié)構(gòu)體的排序?qū)嵗?/h2>
結(jié)構(gòu)體的排序?qū)嵗狠斎?0個學(xué)生的名字和成績,按照成績從高到低排序后輸出
輸入數(shù)據(jù):
Yixiangzhilv 90 Mydr 60 Xiaoming 10 Mr.Glass 60 GZN 80 Wangzi 85 Hyx 100 Wyx 99 Xth 0 Zz 75
程序?qū)崿F(xiàn)如下:
#include <algorithm> #include <iostream> using namespace std; struct node { string name; int score; }; bool cmp(struct node x, struct node y) { return x.score > y.score; } int main() { struct node a[10]; for (int i = 0; i < 10; i++) cin >> a[i].name >> a[i].score; sort(a, a + 10, cmp); for (int i = 0; i < 10; i++) cout << a[i].name << " " << a[i].score << endl; }
(此處還有一個C++知識:如果已經(jīng)定義結(jié)構(gòu)體node,那么 struct node a[10]; 和 node a[10]; 都是合法的)
以上就是詳解C++ sort函數(shù)的cmp參數(shù)的詳細(xì)內(nèi)容,更多關(guān)于C++ sort函數(shù)的cmp參數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章,希望大家以后多多支持腳本之家
相關(guān)文章
Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例
驗(yàn)證碼的原理基于人類視覺和計算機(jī)視覺的差異性,通過給用戶顯示一些難以被機(jī)器識別的圖形或文字,讓用戶進(jìn)行人機(jī)交互,確認(rèn)自己的身份,這樣可以有效保護(hù)網(wǎng)站安全,所以本給大家介紹了Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例,感興趣的朋友可以參考下2024-01-01Java?C++?算法題解leetcode652尋找重復(fù)子樹
這篇文章主要為大家介紹了Java?C++?算法題解leetcode652尋找重復(fù)子樹示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09C++模擬實(shí)現(xiàn)string的詳細(xì)過程
在?C++?編程中,字符串的處理是一項(xiàng)常見且重要的任務(wù),標(biāo)準(zhǔn)庫中的?string?類為我們提供了便捷、高效的字符串操作方法,模擬實(shí)現(xiàn)?string?類?的背景源于對?C++?底層原理的探索欲望,所以本文給大家介紹了C++模擬實(shí)現(xiàn)string的詳細(xì)過程,需要的朋友可以參考下2024-08-08