程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++尺度模板庫函數sort的那些事兒

C++尺度模板庫函數sort的那些事兒

編輯:關於C++

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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved