美文网首页
c++排序相关的参数"cmp"日记

c++排序相关的参数"cmp"日记

作者: codeflame | 来源:发表于2018-02-11 22:26 被阅读0次

对sort函数(需要algorithm头文件),它的cmp可以是“函数”,也可以是“对象”

bool myfunction (int i,int j) { return (i<j); }

struct myclass 
{
  bool operator() (int i,int j) { return (i<j);} 
} myobject;
int main () 
{
  int myints[] = {32,71,12,45,26,80,53,33};
  vector<int> myvector (myints, myints+8);//放进容器vector
  sort(myfunction); //参数cmp是个函数
  sort(myobject);//参数cmp是个结构体对象
  return 0;
}

▲注意:这里的函数myfunction返回类型为bool,返回真时认为i<j,假时认为i>=j,排序默认从小到大,因此反向排序只需把return (i<j)改成return (i>j)。
另外值得一提,结构体的bool operator() (int i,int j)函数,实际上是操作符的重载函数,对括号进行了重载,相当于平时用的operator +(...)这种,因此对于结构体对象myobject,可以这样操作bool re = myobject(1,2);,结果将会返回false,书写的形式跟函数一样(方便理解记忆,实际上参数并不能从“函数”类型转换成“对象”类型,是重载)

-------------------------(分割)----------------------------------------
对qsort函数,cmp是函数名

int values[] = { 40, 10, 100, 90, 20, 25 };
int cmp(const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}
int main ()
{
  int n;
  qsort (values, 6, sizeof(int), cmp);
  return 0;
}

▲注意:这里的函数cmp必须对上原型int (__cdecl* _PtFuncCompare)(void const, void const),说白了就是返回值为int,函数名字随意,函数参数类型要为void const*(const顺序可调)。里面*(int*)a实际就是:先把void*型的指针a强制转成int*指针,在* ((int*)a),把指向对象拿出来比较,如果是其他float/double,不用多说,改成*(double*)之类的。
顺带一题,返回值小于0(一般写成返回-1),认为a比b小,等于0认为相等,大于0(一般写成返回1)认为a比b大,想要从大到小排序,改下即可
-------------------------(分割)----------------------------------------

对STL容器,如优先队列(最大/最小堆,默认为最大堆)priority_queue类来说,其模板参数只能类/结构体名,因此它的"cmp"要为结构体名(注意不是上面说的myobject了,是结构体的名字),里面需有操作符()重载函数。

struct cmp  //名字自定
{
    bool operator ()(int a, int b)
    {
        return a.val < b.val;
    }
}
int main()
{
    /*需要头文件queue,第一个模板参数为数据类型,第二个为容器类型,第三个为结构体*/
    priority_queue<int, vector<int>, cmp> t;  
    return 0;
} 

▲注意:这里的cmp返回值为bool型,函数为对括号的重载函数。
值得一提的是,这个花样还挺多的:

class A
{
  int val;
  bool operator <(int a, int b) const {return a<b;}  //这里const不能省,参数你可写成const int &a等
//friend bool operator <(const int &a, const  int &b) //友元函数也可以
}
int main()
{
  priority_queue< A , vector<A> >  t;
  return 0;
}

如果类中重载了'<',就不用指定队列使用哪个cmp。若指定为最大堆可以第三参数(cmp的位置)可写成less<A>,最小堆可以写成greater<A>,一步到位。
简单来说,STL中模板参数需要填类名,要么类里重载'<'、要么类外写个结构体重载'()'后作模板参数填进去

相关文章

  • c++排序相关的参数"cmp"日记

    对sort函数(需要algorithm头文件),它的cmp可以是“函数”,也可以是“对象” ▲注意:这里的函数my...

  • 一些函数

    cmp函数 C++ sort cmp函数 - lzz的博客 - CSDN博客 浅谈C/C++排序函数中cmp()比...

  • B1015 1015 德才论 (25分)

    考察:排序,cmp + strcmp + sort learn && wrong:1、cmp的编写 2、str的比...

  • 2018-09-17

    c++中需注意的点 c++ sort函数在类内使用是,第三个参数也就是cmp函数若写在类内必须加static;le...

  • Linux学习9_命令总结1(文件管理)

    本文中主要介绍linux中关于文件管理相关的命令以及命令的常用参数: cat cmp chgrp chmod ch...

  • 2018-08-23

    sorted(iterable[, cmp[, key[, reverse]]]) 参数解释: (1)iterab...

  • 5.6-排序及DocValues&Fielddata

    排序 Elasticsearch 默认采⽤相关性算分对结果进⾏ 降序排序 可以通过设定 sorting 参数,⾃⾏...

  • python中__cmp__

    对 int、str 等内置数据类型排序时,Python的 sorted() 按照默认的比较函数 cmp 排序,但是...

  • 排序算法1: 冒泡排序算法

    C++ 冒泡排序算法的实例源代码,一些排序方法的代码集锦,该函数模板使用冒泡法对集合元素进行排序,参数说明: co...

  • python语法备忘录

    list.sort() 列表排序,list.sort(cmp=None, key=None, reverse=Fa...

网友评论

      本文标题:c++排序相关的参数"cmp"日记

      本文链接:https://www.haomeiwen.com/subject/rsultftx.html