C 中對 vector 進行sort()排序 對vector 結構體 部分排序

NO IMAGE
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool comp(const int &a,const int &b)              // sort()比較
{
return a>b;
}
int main(int argc, const char * argv[]) {
//int a[11]={9,8,7,6,5,4,3,2,1,10};
vector<int>a;
for (int i=1; i<=50; i  ) {
a.push_back(i);                        //對a賦值
//a.push_back(rand());                 //rand()生成隨機數
}
random_shuffle(a.begin(), a.end());        // 隨機打亂a
sort(a.begin(), a.begin() 50);           //sort()排序
for (int i=0; i<=49; i  ) { printf("%d ",a[i]); } printf("\n");
return 0;
}

sort函式在使用中非常好用,也非常簡單,而且效率與冒泡或者選擇排序不是一個數量級。本文就sort函式在vector中的用法分為sort函式入門用法與自定義comp比較函式比較結構體這兩個最基本的功能講講其用法:

1、sort入門:

使用sort需要包含algorithm標頭檔案,完整程式碼如下

#include<iostream>
#include<vector>
#include<algorithm>//貌似可以不用,但最好加上。
using namespace std;
int main()
{
vector<int>v;
v.push_back(13);
v.push_back(23);
v.push_back(03);
v.push_back(233);
v.push_back(113);
sort(v.begin(),v.end());
int i=0;
for(i=0;i<5;i  )
{
cout<<v[i]<<endl;
}
system("pause");
return 0;
}

執行結果如下:

3
13
23
113
233
請按任意鍵繼續. . .

可以看到結果是從小到大排序,但如果我需要從大到小排序呢?

2、改寫comp從大到小排序。

加入comp函式後程式碼如下:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool comp(const int &a,const int &b)
{
return a>b;
}
int main()
{
vector<int>v;
v.push_back(13);
v.push_back(23);
v.push_back(03);
v.push_back(233);
v.push_back(113);
sort(v.begin(),v.end(),comp);
int i=0;
for(i=0;i<5;i  )
{
cout<<v[i]<<endl;
}
system("pause");
return 0;
}

執行結果:

233
113
23
13
3
請按任意鍵繼續. . .

為什麼會這樣呢?比較時sort函式根據comp函式進行判斷輸的大小,系統預設a<b時返回真,於是從小到大排,而我的comp函式設定為a>b時返回為真,那麼最終得到的排序結果也相應的從小到大變成從大到小。簡單吧~~

3、對結構體排序

有了comp函式我們就可以實現對任意結構體任意物件進行排序,只需要對應修改comp函式即可實現。程式碼如下:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct ss
{
int a,b;
};
bool comp(const ss &a,const ss &b)
{
return a.a<b.a;
}
int main()
{
vector<ss>v;
ss s1,s2,s3,s4,s5;
s1.a=4;s1.b=23;
s2.a=1;s2.b=213;
s3.a=2;s3.b=231;
s4.a=5;s4.b=123;
s5.a=3;s5.b=223;
v.push_back(s1);
v.push_back(s2);
v.push_back(s3);
v.push_back(s4);
v.push_back(s5);
sort(v.begin(),v.end(),comp);
int i=0;
for(i=0;i<5;i  )
{
cout<<v[i].a<<" "<<v[i].b<<endl;
}
system("pause");
return 0;
}

比如ss結構體中a代表的是索引號,b代表的是索引對應的值,那麼我想按索引排序,通過改寫comp函式即可實現。

結果:

1 213
2 231
3 223
4 23
5 123
請按任意鍵繼續. . .