精华内容
下载资源
问答
  • 就是从大到小}好的,问题又来了,这个cmp与qsort的cmp不一样了,正好相反,他不能写成下面这样://错错错错错错错 错错错错错错错 错错错错错错错 错错错错错错错bool cmp(int a ,int b){return a - b ;...

    ,这个是标准C++头文件里的。

    bool cmp(int a ,int b)

    {

    return a < b ;//从小到大排序,把 < 换成 > 就是从大到小

    }

    好的,问题又来了,这个cmp与qsort的cmp不一样了,正好相反,他不能写成下面这样:

    //错错错错错错错 错错错错错错错 错错错错错错错 错错错错错错错

    bool cmp(int a ,int b)

    {

    return a - b ;

    }

    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    切记,切记!

    下面是sort的测试代码:

    #include #include using namespace std ;

    bool cmp(int a ,int b)

    {

    return a < b ;//从小到大排序,把 < 换成 > 就是从大到小

    }

    int main()

    {

    int a[10]={-1,9,5,7,-11,2,6,8,9,6};

    sort(a,a+10,cmp);

    for(int i = 0 ; i < 10 ; ++i)

    {

    cout<

    测试结果:

    1d95f72406cd4403274e1fc94426da9e.png

    1304533991147212800.htm

    在C++中,我们经常需要用到set,map等容器,他们的cmp基本写法都与sort的相同,当然set,map的cmp可不仅仅是函数了,而是函数对象:

    struct cmp{

    bool operator ()(const int a , const int b)

    {

    return a < b ;// 从小到大,反过来就是从大到小

    }

    };

    下面仅仅对set做代码测试:

    #include #include #include using namespace std ;

    struct Person{

    int age;

    char name[20];

    Person(int Age , const char Name[]):age(Age){strcpy(name,Name);}

    };

    struct cmp{

    bool operator ()(const Person a , const Person b)

    {

    return a.age < b.age ;//从小到大 ;

    }

    };

    int main()

    {

    sets ;

    Person n1(46,"ggg");

    Person n2(-16,"fff");//年龄无负数,只是为了测试代码,下同

    Person n3(45,"eee");

    Person n4(-25,"ddd");

    Person n5(34,"ccc");

    Person n6(22,"bbb");

    Person n7(2,"aaa");

    s.insert(n1);

    s.insert(n2);

    s.insert(n3);

    s.insert(n4);

    s.insert(n5);

    s.insert(n6);

    s.insert(n7);

    set::iterator begin = s.begin();

    set::iterator end = s.end();

    for(set::iterator i = begin ; i != end ; ++i)

    {

    cout

    测试结果:

    fecc17d65c07043b9ceb7f9ed4cdc7ec.png

    好的,废话也说了这么多了,那我们就来个总结吧:

    在调用C的库函数qsort时,因为C语言没有明确的定义bool类型,只是笼统的说,零为假,任何非零都是真,而qsort的cmp函数是返回int的,通过比较两个数据只能返回非零值(真)或零(假),具体返回多少,得看编译器,据我猜测qsort内部是根据返回的正或负或0来判断两个数之间的大小或等于关系的,这时用就不能正常排序了。

    而在C++中,已经定义了bool类型,而且sort的cmp函数返回的是bool类型的,说明sort的判断方式与qsort不同的,需要返回一个布尔值,来判断两个数之间的关系的。

    所以在C++中应该使用sort中t的cmp函数写法;

    这篇文章纯属交流,有错请望指出!

    ps:以上代码均在Dev C++ 5.4.1中实验。

    展开全文
  • C++中sort函数和cmp函数的使用 sort函数是C++algorithm库中的一个函数,源码实现是快排,使用时需要在文件中添加头文件 #include <algorithm> sort函数的参数列表中的第三个参数可以是一个函数指针,一般使用...

    C++中sort函数和cmp函数的使用

    sort函数是C++algorithm库中的一个函数,源码实现是快排,使用时需要在文件中添加头文件

    #include <algorithm>
    

    sort函数的参数列表中的第三个参数可以是一个函数指针,一般使用cmp作为函数指针的命名:

    vector<int> vec;
    bool cmp(const T a, const T b){
    	return a > b;
    }
    sort(vec.begin(), vec.end(), cmp);
    

    cmp函数返回true,则不会更换位置,上面的代码的结果就是将vector中的元素从大到小排列。cmp返回位置,则需要更换vector中a和b的位置,a和b是vector的元素。

    展开全文
  • 今天很疑惑,发现关于sort函数中的cmp函数大家有着不同的写法。 比如如下代码,有人是这么写的: bool cmp(int a, int b){ return a>b; } int a[10]; sort(a,a+10,cmp); 也有人是这么写的: bool cmp(const...

    今天很疑惑,发现关于sort函数中的cmp函数大家有着不同的写法。

    比如如下代码,有人是这么写的:

    bool cmp(int a, int b){
        return a>b;
    }
    int a[10];
    sort(a,a+10,cmp);


    也有人是这么写的:

    bool cmp(const int &a, const int &b){
        return a>b;
    }
    
    int a[10];
    sort(a,a+10,cmp);
    



    我想不对啊,&不是去地址的意思吗?用地址比较不是很奇怪吗?


    原来&的功能有两点:1. 取地址 2. 表示一个引用。


    同时为什么要用const呢?

    后来自己写了几个样例比较了一下,发现第二种方法const int &a是最科学的:


    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    bool cmp1(const int &a,const int &b)
    {
        // a=1; The change of a&b is not allowed.
        // b=1;
        return a>b;
    }// Best way.
    
    bool cmp2(const int a,const int b)
    {
        return a>b;
    }// ???? Everybody just not use the way like this.
    
    bool cmp3(int &a, int &b)
    {
        return a>b;
    }// wrong way, a&b might change in the system, like we could assign 1 to a and b.
    
    bool cmp4(int a, int b)
    {
        a=1;
        b=1;
        return a>b;
    }// wrong way, a&b won't change in the cmp; but it may cause problem.
    
    
    int main()
    {
        vector<int>v;
        v.push_back(13);
        v.push_back(23);
        v.push_back(3);
        v.push_back(233);
        v.push_back(113);
        v.push_back(1113);
    
        sort(v.begin(),v.end(),cmp1);
        
        int i=0;
        for(i=0;i<5; i++)
        {
            cout<<v[i]<<endl;
        }
        return 0;
    }




    展开全文
  • 集训二:排序及CMP函数前言一、sort排序(c++自带函数)1.我们做一个初步了解:2. 函数有三个参数二、cmp函数1.格式2.多层次比较的情况三、桶排序(一种小技巧)1.桶排序的介绍2.桶排序的举例3.补充四、总结 前言 因...


    前言

    因众多学长学姐已经详细出过集训的答案,故在此不做补充,谨提供课堂笔记以作参考。(大一新生一枚,所写内容不够严谨,望多多包涵互相进步)


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、sort排序(c++自带函数)

    1.我们做一个初步了解:

    a.在c语言中我们的排序通常为冒泡选择方法。
    b.sort排序的复杂度为n*log(n)。
    c.包含在头文件

    #include<algorithm>
    

    的c++标准库里。

    2. 函数有三个参数

    a.要排序的数组的起始地址。
    b.数组的结束地址。
    c.第三个参数是排序的方法,可以不写,默认是从小到大。
    格式:sort(a,a+n) -----默认从小到大排序
    比如 int a[ ]={2,7,1,5,0} 五个数
    我们可以写成 sort(a,a+5);
    即:a为数组名,a+n的n为数组a中的前n个元素。

    int a[10]
    sort(a,a+n);
    //其中的排序是从a[0]开始的直到a[n],而非从a[1]开始,故我们写作 sort(a+1,a+1+n);便可以从a[1]开始,这也是老师的一贯写法。
    

    d.从小到大排序可以写成
    sort(a,a+n,less<要进行排序的数据类型>())
    从大到小排序可以写成
    sort(a,a+n,greater<要进行排序的数据类型>())
    其中要进行排序的数据类型可以是我们自己定义的如cmp函数

    e.举例

    #include <bits/stdc++.h>
    using namespace std;
    struct sa
    {
        int a;
        int b;
    }data[100];//集训一中我们所学的结构体
    int main()
    {
        for(int i=1;i<=5;i++)
            cin>>data[i].a>>data[i].b;
        sort(data+1,data+1+5);// 此处为默认排序从小到大
        for(int i=1;i<=5;i++)
            cout<<data[i].a<<" "<<data[i].b<<endl;
        return 0;
    }
    
    

    二、cmp函数

    1.格式

    比如我们要按成绩排序从高到低
    int cmp1(stu a,stu b)
    {
    return a.chengji>b.chengji;
    }
    其中
    cmp为函数名称
    stu 为数组,可能为结构体数组
    stu a,stu b 中的a,b 指两个任意数组
    返回值中的 chengji 指的是结构体中的变量
    return 中的 “>” 表示从大到小排列

    举例

    int cmp2(int a,int b)
    {
    return a<b;
    }

    其中我们常见一种写法用到了bool型函数指的是返回值为bool类型的函数,其调用方式和int 型函数没有太大的区别。
    bool型变量的值只有 真 (true) 和假 (false),bool可用于定义函数类型为布尔型。
    举例

    bool cmp1(stu a,stu b)
    {
    return a.chengji>b.chengji;
    }

    2.多层次比较的情况

    对于一个结构体,如果们要求a数组按x值的从小到大排序,若x相等,按y的从小到大排,我们写成:

    struct node
    {  
     int x,y;
    }a[10];
    bool cmp3(node a,node b)
    {
       if(a.x==b.x)
          return a.y<b.y;
        else   return a.x<b.x;
    }
    

    当然也可以涉及很多个方面的逐一排序,方法同上

    三、桶排序(一种小技巧)

    1.桶排序的介绍

    桶排序是一种计数排序,就是把要排序的数据放到桶里,我们需要设置桶的数量(即排序的范围),把数据放到与之匹配的桶里,改变记录桶有多少个数据的变量(一定要在装数据之前初始化),输出时要遍历所有桶,选数据不为0的数据输出,按编号输出即可。

    2.桶排序的举例

    举个例子:小明班上五个同学,他们期末考试的成绩分别是5分,3分,5分,2分,8分(满分10分)
    我们要把他们的成绩排序
    首先,我们可以想到可以用sort排序
    另一种方法:分数的取值是0~10分,我们可以定义一个一维数组a[11],刚开始我们把这个数组里的所有元素初始化为0,表示这些分数还没有人得过,比如a[0]=0,即还没有人获得0分…a[10]=0,即还没与人获得10分
    在这里插入图片描述
    下面开始处理这五个人的分数
    5分,3分,5分,2分,8分
    第一个人5分,我们把a[5]的值改为1,意思是5分出现过一次
    在这里插入图片描述
    第二个人是3分,我们把a[3]的值改成1,意思是3分出现过1次
    在这里插入图片描述
    以此类推后整体的过程如下图:
    在这里插入图片描述

    实现过程代码如下:

    #include<stdio.h> int main() {
        int a[11],i,j;
        for(i=0;i<11;i++)
        {
            a[i]=0;
        }
        int n;//人数
        scanf("%d",&n);
        int t;//用t接收分数
        for(i=0;i<n;i++)
        {
           scanf("%d",&t);
           a[t]++;
        }
         for(i=0;i<11;i++)
        {
            for(j=1;j<=a[i];j++)
            {
                printf("%d ",i);
            }
        }
        printf("\n");
        return 0; } 
        若是从大到小输出则把
        for(i=0;i<11;i++)改成
        for(i=10;i>=0;i--)即可
      //参考原作者ljw学长
    

    3.补充

    a.在装数据之前要初始化。
    b.输出时要遍历所有的桶。
    c.选数据不为0的数据输出,按编号输出即可。


    四、总结

    sort与cmp通常需要我们结合起来运用,再配合结构体数组效果更佳;而桶排序在特定场景中会有不一样的效果。
    参考:林大ACM集训队寒假第二讲。

    展开全文
  • sort以及qsort函数cmp 转自 http://blog.csdn.net/lionel_d/article/details/41746135 写的很好,直接复制粘贴过来了,感谢一、sort 以及 qsort首先,我们来谈谈大名鼎鼎的void qsort(void *base,int nelem,int ...
  • 需要algorithm头文件。 sort(first, last, cmp): first是要排序区间首地址 last是区间尾地址的下一地址 cmp排序规则,默认升序 也就是说,排序的区间是[a,b)。例如,有一个数组int a[100],要对从a[0]到a[99]的...
  • bool cmp(pair,int> &a,pair,int> &b){//&可有可无 if(a.second==b.second){ return a.first; } return a.second; } int main() { unordered_map,int> m; m[1]=100; m[2]=20; m[3]=3000; m[4]=100; m[5]=...
  • acm新手小白必看系列之(2)——排序及cmp函数 sort排序 sort是c++自带函数 复杂度 n*log(n) 包含在头文件 #include的c++标准库里 函数有三个参数 1.要排序的数组的起始地址 2.数组的结束地址 3.第三个参数是排序的...
  • c++sort 函数&&bool函数

    2020-03-08 18:36:31
    头文件为#include"algorithm" sort函数的模板有三个参数: void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp); (1)第一个参数first:是要排序的数组的起始地址。 (2)第二个参数...
  • sort()函数 sort()函数的使用 sort()函数的使用必须加上头文件#include <algorithm>,其使用方式如下: ...如果想将ssd数组按照x从大到小排序(即进行一级排序),那么可以这样写cmp函数bool cmp(nod
  • bool类型,pow函数

    2017-12-09 13:02:04
    在C++中还有bool类型函数,返回值只有true、false #include&lt;iostream&gt; using namespace std; bool cmp(int a,int b){ if(a &gt; b){ return true; }else{ return false; } } int main() {...
  • algorithm头文件下常用函数 1.max(),min(),abs() 应用:max(x,y)和min(x,y)分别返回x和y中的最大值和最小值,且参数必须是两个。 abs(x) 返回x的绝对值。x必须为整数,浮点型的绝对值要用math头文件下的fabs 2....
  • cmp比较函数

    万次阅读 2018-05-01 18:12:37
    浅谈C/C++排序函数cmp()比较函数的写法 首先,我们来谈谈大名鼎鼎的void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *)); 它属于C语言标准库函数,应该是运用最多的了,今天我...
  • 调用什么函数需要用到什么头文件

    千次阅读 2019-06-13 16:59:44
    ※调用strcmp函数要用到#include <cstring> / #include <string.h> 例子:比较char型字符...bool cmp (Student a,Student b){ if(a.score!=b.score)return a.score>b.score; else return strcmp(...
  • algorithm头文件常用函数

    千次阅读 多人点赞 2019-01-10 19:23:43
    ,是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模板函数。 类 别 C++标准库 头文件 #include &amp;lt;algorithm&amp;gt; 命名空间 using namespace std 其中包括...
  • C++中常用函数总结(头文件

    千次阅读 2020-05-25 15:55:32
    文章目录1 algorithm1.1 常用函数1.2 代码示例 1 algorithm 1.1 常用函数 类型 函数 说明 举例 最大值 Int/double = max( a,b) 结果类型和a、b对应 (int/ double); <cmath>也相同 最小值 Int/...
  • qsort与sort函数中cmp的编写方法在使用C/C++语言进行编程时,为了方便起见,我们在排序时经常调用系统提供的排序函数来完成部分排序功能,本文将介绍qsort与sort函数的用法,尤其是其cmp函数的编写方法。一.qsort...
  • #include&amp;amp;lt;iostream&amp;amp;gt; #include&amp;amp;lt;algorithm&amp;amp;gt; using namespace std; struct student{ int id;...bool cmp(int a,int b){ ...bool cmp1(studen
  • C++中cmp()函数用途很多,特此总结: ...bool cmp(int a, int b) { return a > b;//值传递 } int main() { int a[5] = { 1,5,2,4,3 }; sort(a, a + 5,cmp);//sort()函数包含在头文件<algorithm&g
  • algorithm头文件函数全集——史上最全,最贴心

    万次阅读 多人点赞 2020-02-22 20:50:57
    而这些“现成的函数”大部分都来自于algorithm头文件。简直是我等懒癌的福音啊!   当然,也有很多朋友喜欢自己写函数。因人而异吧,哈哈   为了更方便、易懂, 笔者将每个函数的用法都注释在了代码中,想要验证...
  • C++ algorithm头文件函数的基本用法

    千次阅读 多人点赞 2018-04-08 14:43:18
    /*algorithm头文件下的常用函数*/ /* 使用algorithm头文件,需要在头文件下加一行using namespace std;” */ //常用函数max(), min(), abs() //swap() //reverse() //next_permutation() //fill() // sort() //...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,160
精华内容 2,064
关键字:

boolcmp函数头文件