C++尺度模板庫函數sort的那些事兒。本站提示廣大學習愛好者:(C++尺度模板庫函數sort的那些事兒)文章只能為提供參考,不一定能成為您想要的結果。以下是C++尺度模板庫函數sort的那些事兒正文
STL外面有個sort函數,可以直接對數組排序,龐雜度為n*log2(n)。sort()界說在在頭文件<algorithm>中。sort函數是尺度模板庫的函數,已知開端和停止的地址便可停止排序,可以用於比擬任何容器(必需知足隨機迭代器),任何元素,任何前提,履行速度普通比qsort要快。別的,sort()是類屬函數,可以用於比擬任何容器,任何元素,任何前提。
詳細事例以下:
char ch[20]="sdasdacsdasdas";
cout<<ch<<endl;
sort(ch,ch+14);
cout<<ch<<endl;
留意:缺省是升序排序。sort中一個轉變排序次序的例子以下(降序):
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp (const int a, const int b)
{
return a > b;
}
int main()
{
int data[5];
for(int i = 0; i < 5; i++)
cin >> data[i];
sort(data, data + 5, cmp);
return 0;
}
這個函數可以傳兩個參數或三個參數。第一個參數是要排序的區間首地址,第二個參數是區間尾地址的下一地址。也就是說,排序的區間是[a,b)。簡略來講,有一個數組int a[100],要對從a[0]到a[99]的元素停止排序,只需寫sort(a,a+100)就好了,默許的排序方法是升序。如須要對數組t的第0到len-1的元素排序,就寫sort(t,t+len);對向量v排序也差不多,sort(v.begin(),v.end());排序的數據類型不局限於整數,只需是界說了小於運算的類型都可以,好比字符串類string。
假如是沒有界說小於運算的數據類型,或許想轉變排序的次序,就要用到第三參數——比擬函數。比擬函數是一個本身界說的函數,前往值是bool型,它劃定了甚麼樣的關系才是“小於”。想把適才的整數數組按降序分列,可以先界說一個比擬函數cmp:
bool cmp(int a,int b)
{
return a>b;
}排序的時刻就寫sort(a,a+100,cmp);
假定本身界說了一個構造體node:
struct node{
int a;
int b;
double c;
};
有一個node類型的數組node arr[100],想對它停止排序:先按a值升序分列,假如a值雷同,再按b值降序分列,假如b還雷同,就按c降序分列。便可以寫如許一個比擬函數:
以下是代碼片斷:
bool cmp(node x,node y)
{
if(x.a!=y.a) return x.a
if(x.b!=y.b) return x.b>y.b;
return return x.c>y.c;
}
排序時寫sort(arr,a+100,cmp);
最初看一個完全的實例,一道標題“文件名排序 ”。
以下是代碼片斷:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
//界說一個構造體來表現文件,a代表文件名,b代表文件類型(要末"File"要末"Dir")
struct node{
string a,b;
};
//ASCII碼中,一切年夜寫字母排在一切小寫字母後面,'A'<'Z'<'a'<'z'
//而這題請求疏忽年夜小寫,所以不克不及直接用字符串的比擬。自界說了一個lt函數,就是less than的意思
//先把兩個字符串全體轉化為小寫,再比擬年夜小(字典序)
bool lt(string x,string y)
{
int i;
for(i=0;i<x.length();i++)
if(x[i]>='A'&&x[i]<='Z')
x[i]='a'+(x[i]-'A');
for(i=0;i<y.length();i++)
if(y[i]>='A'&&y[i]<='Z')
y[i]='a'+(y[i]-'A');
return x<y;
}
//自界說的比擬函數,先按b值升序分列(也就是"Dir"排在"File"後面)
//假如b值雷同,再按a升序分列,用的是適才界說的lt函數
bool comp(node x,node y)
{
if(x.b!=y.b) return x.b<y.b;
return lt(x.a,y.a);
}
int main()
{
node arr[10001];
int size=0;
while(cin>>arr[size].a>>arr[size].b)
size++;
sort(arr,arr+size,comp);
for(int i=0;i<size;i++)
cout<<arr[i].a<<" "<<arr[i].b<<endl;
return 0;
}