STL常用算法之排序算法詳解
STL常用算法排序算法
1、sort()
- sort():對(duì)容器或普通數(shù)組中范圍內(nèi)的元素進(jìn)行排序,默認(rèn)進(jìn)行升序排序,也可以自定義排序規(guī)則。
- sort() 函數(shù)只對(duì) array、vector、deque 這 3 個(gè)容器提供支持。
- sort() 函數(shù)在對(duì)自定義的類(lèi)對(duì)象實(shí)現(xiàn)排序時(shí),需要在該類(lèi)的內(nèi)部提供移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符。
函數(shù)原型:該函數(shù)有以下兩種語(yǔ)法格式
//對(duì) [beg, end) 區(qū)域內(nèi)的元素做默認(rèn)的升序排序 sort (iterator beg,iterator end); //按照指定的 comp 排序規(guī)則,對(duì) [beg, end) 區(qū)域內(nèi)的元素進(jìn)行排序 sort (iterator beg,iterator end, Compare comp);
參數(shù)說(shuō)明:
- beg 開(kāi)始迭代器
- end 結(jié)束迭代器
- comp 標(biāo)準(zhǔn)庫(kù)提供的排序規(guī)則(如 greater<T>);或普通函數(shù)以及函數(shù)對(duì)象接收的自定義的排序規(guī)則
默認(rèn)排序和標(biāo)準(zhǔn)庫(kù)提供的排序
#include<iostream> using namespace std; #include<algorithm> #include<vector> void myPrint(int val) { cout << val << " "; } void test01() { vector<int> v{1,4,5,3,2}; //默認(rèn)升序排序 sort(v.begin(), v.end());//1 2 3 4 5 for_each(v.begin(), v.end(), myPrint); cout << endl; //從大到小排序,標(biāo)準(zhǔn)庫(kù)提供的排序規(guī)則 sort(v.begin(), v.end(), greater<int>());//5 4 3 2 1 for_each(v.begin(), v.end(), myPrint); cout << endl; } int main() { test01(); system("pause"); return 0; }
自定義排序規(guī)則
#include<iostream> using namespace std; #include<algorithm> #include<vector> void myPrint(int val) { cout << val << " "; } //以普通函數(shù)的方式實(shí)現(xiàn)自定義排序規(guī)則(升序) bool mycomp(int i, int j) { return (i < j); } //以函數(shù)對(duì)象的方式實(shí)現(xiàn)自定義排序規(guī)則(升序) class mycomp2 { public: bool operator() (int i, int j) { return (i < j); } }; void test01() { vector<int> v{ 32, 71, 12, 45, 26, 80, 53, 33 }; sort(v.begin(), v.end(), mycomp);//12 26 32 33 45 53 71 80 for_each(v.begin(), v.end(), myPrint); cout << endl; sort(v.begin(), v.end(), mycomp2());//12 26 32 33 45 53 71 80 for_each(v.begin(), v.end(), myPrint); cout << endl; } int main() { test01(); system("pause"); return 0; }
2、random_shuffle()
random_shuffle():指定范圍內(nèi)的元素隨機(jī)調(diào)整次序
函數(shù)原型:
random_suffle(iterator beg,iterator end);
參數(shù)說(shuō)明:
- beg 開(kāi)始迭代器
- end 結(jié)束迭代器
#include<iostream> using namespace std; #include<vector> #include<algorithm> #include<ctime> void myPrint(int val) { cout << val << " "; } void test01() { vector<int> v; for (int i = 0; i < 10; i++) { v.push_back(i); } //打亂順序前的遍歷 for_each(v.begin(), v.end(), myPrint); cout << endl; //打亂順序后的遍歷 random_shuffle(v.begin(), v.end()); for_each(v.begin(), v.end(), myPrint); cout << endl; } int main() { //加入隨機(jī)數(shù)種子,使每次程序啟動(dòng)的隨機(jī)數(shù)都不一樣 srand((unsigned int)time(NULL)); test01(); system("pause"); return 0; }
3、merge()
合并排序,merge() 函數(shù)用于將 2 個(gè)有序序列合并為 1 個(gè)有序容器,前提是這 2 個(gè)有序容器的排序規(guī)則相同(要么都是升序,要么都是降序)。并且最終借助該函數(shù)獲得的新有序容器,其排序規(guī)則也和這 2 個(gè)有序容器要相同。
函數(shù)原型:該函數(shù)有以下兩種格式
//默認(rèn)升序?yàn)榕判蛞?guī)則,[beg1, end1) 和 [beg2, end2) 指定區(qū)域內(nèi)的元素必須支持 < 小于運(yùn)算符 merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest); //自定義的 comp 規(guī)則作為排序規(guī)則,[beg1, end1) 和 [beg2, end2) 指定區(qū)域內(nèi)的元素必須支持comp 排序規(guī)則內(nèi)的比較運(yùn)算符 merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest, Compare comp);
參數(shù)說(shuō)明:
- beg1 容器1開(kāi)始迭代器
- end1 容器1結(jié)束迭代器
- beg2 容器2開(kāi)始迭代器
- end2 容器2結(jié)束迭代器
- dest 目標(biāo)容器開(kāi)始迭代器,為最終生成的新有序序列指定存儲(chǔ)位置
- comp 用于自定義排序規(guī)則
默認(rèn)排序
void myPrint(int val) { cout << val << " "; } void test01() { //有序的容器 vector<int> v1; vector<int> v2; for (int i = 0; i < 10; i++) { v1.push_back(i); v2.push_back(i * 2); } //新有序容器 vector<int> v3; //一定要提前給容器分配空間 v3.resize(v1.size() + v2.size()); merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); //打印出來(lái)的還是個(gè)有序序列 for_each(v3.begin(), v3.end(), myPrint);//0 0 1 2 2 3 4 4 5 6 6 7 8 8 9 10 12 14 16 18 cout << endl; }
自定義排序規(guī)則
void myPrint(int val) { cout << val << " "; } //以普通函數(shù)的方式實(shí)現(xiàn)自定義排序規(guī)則(降序) bool mycomp(int i, int j) { return (i > j); } //以函數(shù)對(duì)象的方式實(shí)現(xiàn)自定義排序規(guī)則(降序) class mycomp2 { public: bool operator() (int i, int j) { return (i > j); } }; void test01() { //有序的容器 vector<int> v1; vector<int> v2; for (int i = 10; i > 0; i--) { v1.push_back(i); v2.push_back(i * 2); } //新有序容器 vector<int> v3; //一定要提前給容器分配空間 v3.resize(v1.size() + v2.size()); merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin(), mycomp); for_each(v3.begin(), v3.end(), myPrint);//20 18 16 14 12 10 10 9 8 8 7 6 6 5 4 4 3 2 2 1 cout << endl; merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin(), mycomp2()); for_each(v3.begin(), v3.end(), myPrint);//20 18 16 14 12 10 10 9 8 8 7 6 6 5 4 4 3 2 2 1 cout << endl; }
4、reverse()
reverse()函數(shù):將容器指定范圍內(nèi)的元素進(jìn)行反轉(zhuǎn)
函數(shù)原型:
reverse(iterator beg,iterator end);
參數(shù)說(shuō)明:
- beg 開(kāi)始迭代器
- end 結(jié)束迭代器
void myPrint(int val) { cout << val << " "; } void test01() { vector<int> v1; //有序的容器 for (int i = 0; i < 10; i++) { v1.push_back(i); } reverse(v1.begin(), v1.end()); for_each(v1.begin(), v1.end(), myPrint);//9 8 7 6 5 4 3 2 1 0 cout << endl; }
到此這篇關(guān)于STL常用算法之排序算法詳解的文章就介紹到這了,更多相關(guān)STL排序算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中為何推薦要把基類(lèi)析構(gòu)函數(shù)設(shè)置成虛函數(shù)
這篇文章主要介紹了C++中為何推薦要把基類(lèi)析構(gòu)函數(shù)設(shè)置成虛函數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12C語(yǔ)言實(shí)現(xiàn)學(xué)生選修課程系統(tǒng)設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生選修課程系統(tǒng)設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02C++函數(shù)對(duì)象Functor與匿名函數(shù)對(duì)象Lambda表達(dá)式詳解
這篇文章主要介紹了C++函數(shù)對(duì)象Functor(仿函數(shù))與匿名函數(shù)對(duì)象(Lambda表達(dá)式)詳細(xì)介紹以及底層實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)經(jīng)典10大排序算法刨析
這篇文章主要介紹了C語(yǔ)言中常用的10種排序算法及代碼實(shí)現(xiàn),開(kāi)發(fā)中排序的應(yīng)用需要熟練的掌握,因?yàn)槭腔A(chǔ)內(nèi)容,那C語(yǔ)言有哪些排序算法呢?本文小編就來(lái)詳細(xì)說(shuō)說(shuō),需要的朋友可以參考一下2022-02-02C++實(shí)現(xiàn)彩色飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)彩色飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06C語(yǔ)言實(shí)現(xiàn)輸入一顆二元查找樹(shù)并將該樹(shù)轉(zhuǎn)換為它的鏡像
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)輸入一顆二元查找樹(shù)并將該樹(shù)轉(zhuǎn)換為它的鏡像,是數(shù)據(jù)結(jié)構(gòu)中二元查找樹(shù)的一個(gè)比較經(jīng)典的算法,有不錯(cuò)的借鑒價(jià)值,需要的朋友可以參考下2014-09-09C++字符數(shù)組的輸入輸出和字符串結(jié)束標(biāo)志使用講解
這篇文章主要介紹了C++字符數(shù)組的輸入輸出和符串結(jié)束標(biāo)志使用講解,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09