• 【C++】自定义比较函数小结


    1、使用结构体grid作为map的key

    struct grid
    {
        int x;
        int y;
    };

    (1)需要自定义比较函数operator<,不然会报错:

    error C2784: “bool std::operator <(const std::deque<_Ty,_Alloc> &,const std::deque<_Ty,_Alloc> &)”: 未能从“const grid”为“const std::deque<_Ty,_Alloc> &”推导 模板 参数

    (2)需要定义为const成员函数,不然会报错:

    error C2678: 二进制“<”: 没有找到接受“const grid”类型的左操作数的运算符(或没有可接受的转换)

    (3)需要确定唯一序

    如果只写

    return x<g.x

    那么对于(1,2)和(1,1),比较结果为(1,2)<(1,1)并且(1,1)<(1,2),然而显然两者并不相等。

    正确的定义方法为:

    struct grid
    {
        int x;
        int y;
        bool operator<(const grid& g)
        {//define operator for custom key
            if(x != g.x)
                return x < g.x;
            else
                return y < g.y;
        }
    };

    2、自定义标准库函数sort的compare

    (1)compare函数中,如果是升序,必须是<而不是<=,否则出现相同元素时会运行错误:

    解释:参考http://www.cplusplus.com/reference/list/list/sort/,比较必须产生strick weak ordering。

    对于strick weak ordering 可以参考http://stackoverflow.com/questions/979759/operator-and-strict-weak-ordering/981299#981299

    的详细说明。

    总之,如果a,b不等,那么compare(a,b)和compare(b,a)其中之一为true,另一为false。

    如果a,b相等,则都应该为false。

    (2)compare函数必须声明为静态成员函数或者全局函数,不能作为普通成员函数,不然会报错:

    error C3867: “Solution::compare”: 函数调用缺少参数列表;请使用“&Solution::compare”创建指向成员的指针

    解释:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法在sort中调用非静态成员函数。

    可以把compare改成静态或者全局函数,使之不依赖于具体对象。

  • 相关阅读:
    Java并发2
    使用Redis锁可能出现的问题
    社区项目前端vue总结
    社区项目Redis分布式锁穿透击穿雪崩
    社区项目遇到的问题
    html2canvas 下载的图片有空白 Amy
    html2canvas 支持backgroundClip:text Amy
    查看nacvicate连接数据库密码
    CPU飙升问题排查
    vue3 学习笔记
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4187538.html
Copyright © 2020-2023  润新知