C++排序函数sort的用法

    xiaoxiao2021-03-25  101

      C++   Algorithm library   Defined in header  <algorithm>    template< class RandomIt > void sort( RandomIt first, RandomIt last ); (1)   template< class ExecutionPolicy, class RandomIt > void sort( ExecutionPolicy&& policy, RandomIt first, RandomIt last ); (2) (since C++17) template< class RandomIt, class Compare > void sort( RandomIt first, RandomIt last, Compare comp ); (3)   template< class ExecutionPolicy, class RandomIt, class Compare > void sort( ExecutionPolicy&& policy, RandomIt first, RandomIt last, Compare comp ); (4) (since C++17) Example:

    #include <algorithm> #include <functional> #include <array> #include <iostream>   int main() { std::array<int, 10> s = {5, 7, 4, 2, 8, 6, 1, 9, 0, 3};   // sort using the default operator< std::sort(s.begin(), s.end()); for (auto a : s) { std::cout << a << " "; } std::cout << '\n';   // sort using a standard library compare function object std::sort(s.begin(), s.end(), std::greater<int>()); for (auto a : s) { std::cout << a << " "; } std::cout << '\n';   // sort using a custom function object struct { bool operator()(int a, int b) { return a < b; } } customLess; std::sort(s.begin(), s.end(), customLess); for (auto a : s) { std::cout << a << " "; } std::cout << '\n';   // sort using a lambda expression std::sort(s.begin(), s.end(), [](int a, int b) { return b < a; }); for (auto a : s) { std::cout << a << " "; } std::cout << '\n'; } Output:

    0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0

    因为我们将要在程序中使用了sort库函数,我们在头文件方面包含了algorithm头文件,并使用using namespace std语句声明了我们将会使用标准命名空间(sort 被定义在其中)。

    一种是自己编写一个比较函数来实现,接着调用三个参数的sort:sort(begin,end,compare)就成了。对于list容器,这个方法也适用,把compare作为sort的参数就可以了,即:sort(compare).

    1)自己编写compare函数:

    例:

    题目描述:

        对输入的n个数进行排序并输出。

    输入:

        输入的第一行包括一个整数n(1<=n<=100)。     接下来的一行包括n个整数。

    输出:

        可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。     每组测试数据的结果占一行。

    样例输入: 4 1 4 3 2 样例输出: 1 2 3 4

    #include<stdio.h> #include<algorithm> using namespace std; bool cmp(int x,int y) { return x<y;//降序排列,若改为x<y则为升序排列 } int main() { int n; int buf[100]; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d",&buf[i]); } sort(buf,buf+n,cmp); for(int i=0;i<n;i++) { printf("%d",buf[i]); } printf("\n"); } return 0; }

    如该代码所示,我们新定义了一个cmp函数,来实现对于新的排序规则的定义。关于cmp函数的定义规则我们只需简单的记得,当cmp的返回值为 true 时,即表示 cmp函数的第一个参数将会排在第二个参数之前(即在我们定义的规则中,cmp表示第一个参数是否比第二个参数大,若是,则排在前面)。为了实现降序排列,我们只要判断两个参数的大小,当第一个参数比第二个参数大时返回true。然后,只需要调用sort函数的另一种重载方式: sort(排序起始地址,排序结束地址,比较函数),如代码所示,我们便完成了对我们给定的内存区间的降序排列。对于利用sort函数为其它基本类型(如 doublechar等)排序的方法也大同小异。 使用内置函数 sort 的方法,简单易懂,且不易出错,对各种类型的排序写法也大同小异。所以,强烈推荐大家使用sort来完成排序。

    2)更进一步,让这种操作更加能适应变化。也就是说,能给比较函数一个参数,用来指示是按升序还是按降序排,这回轮到函数对象出场了。

    为了描述方便,我先定义一个枚举类型EnumComp用来表示升序和降序。很简单:

    enum Enumcomp{ASC,DESC};

    然后开始用一个类来描述这个函数对象。它会根据它的参数来决定是采用“<”还是“>”。

    class compare {       private:             Enumcomp comp;       public:             compare(Enumcomp c):comp(c) {};       bool operator () (int num1,int num2)           {             switch(comp)               {                  case ASC:                         return num1<num2;                  case DESC:                         return num1>num2;               }           } };

    接下来使用 sort(begin,end,compare(ASC)实现升序,sort(begin,end,compare(DESC)实现降序。

    主函数为:

    int main() {      int a[20]={2,4,1,23,5,76,0,43,24,65},i;      for(i=0;i<20;i++)          cout<<a[i]<<endl;      sort(a,a+20,compare(DESC));      for(i=0;i<20;i++)          cout<<a[i]<<endl;      return 0; }

    3)其实对于这么简单的任务(类型支持“<”、“>”等比较运算符),完全没必要自己写一个类出来。标准库里已经有现成的了,就在functional里,include进来就行了。functional提供了一堆基于模板的比较函数对象。它们是(看名字就知道意思了):equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。对于这个问题来说,greater和less就足够了,直接拿过来用:

    升序:sort(begin,end,less<data-type>());降序:sort(begin,end,greater<data-type>()).

    int _tmain(int argc, _TCHAR* argv[]) {       int a[20]={2,4,1,23,5,76,0,43,24,65},i;       for(i=0;i<20;i++)           cout<<a[i]<<endl;       sort(a,a+20,greater<int>());       for(i=0;i<20;i++)           cout<<a[i]<<endl;       return 0; }

    4)既然有迭代器,如果是string 就可以使用反向迭代器来完成逆序排列,程序如下:

    int main() {      string str("cvicses");      string s(str.rbegin(),str.rend());      cout << s <<endl;      return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-25344.html

    最新回复(0)