当前位置:  开发笔记 > 编程语言 > 正文

比较函数类型与运算符<

如何解决《比较函数类型与运算符<》经验,为你挑选了3个好方法。

在Google C++样式指南中,有关运算符重载的部分建议不要重载任何运算符("在罕见的特殊情况下除外").具体来说,它建议:

特别是,不要重载 operator==operator<只是使您的类可以用作STL容器中的键; 相反,您应该在声明容器时创建相等和比较函数类型.

我对这样的仿函数看起来有点模糊,但我的主要问题是,你为什么要为此编写自己的仿函数?不会定义operator<,并使用标准std::less函数,更简单?使用一个优于另一个是否有任何优势?



1> Konrad Rudol..:

除了更基本的类型,小于操作并不总是微不足道,甚至平等可能因情况而异.

想象一下,航空公司希望为所有乘客分配登机号码的情况.这个数字反映了登机顺序(当然).现在,是谁决定谁来谁?您可以采取客户注册的顺序 - 在这种情况下,小于操作将比较登记时间.您可能还会考虑客户为其机票支付的价格 - 低于现在比较机票价格的价格.

… 等等.总而言之,虽然可能需要在一个分类的容器中安排乘客,但operator <Passenger课堂上定义一个人并没有意义.我认为这就是谷歌所警告的.



2> Greg Rogers..:

通常,定义operator<更好,更简单.

您需要使用仿函数的情况是需要多种方法来比较特定类型.例如:

class Person;

struct CompareByHeight {
    bool operator()(const Person &a, const Person &b);
};

struct CompareByWeight {
    bool operator()(const Person &a, const Person &b);
};

在这种情况下,可能没有一个好的"默认"方式来比较和订购人,所以不定义operator<和使用仿函数可能会更好.你也可以说一般人都是按身高排序的,所以operator<只是打电话CompareByHeight,任何需要按重量排序的人都必须CompareByWeight明确使用.

通常问题是定义函子是由类的用户决定的,因此每当需要在有序容器中使用类时,您往往会对同一事物进行许多重新定义.



3> James Curran..:

好吧,根据你引用的网页,对于仿函数来说没有多少优势("[运营商]可以欺骗我们的直觉,认为昂贵的操作是廉价的内置操作.")

我的感觉是,人们应该尽可能地努力让你成为一流的物品,对我而言,这意味着要让他们理解尽可能多的操作者.

我写了一个仿函数已经有一段时间了,但它看起来像这样:

class MyClass {....}

class LessThanMyClass : std:binary_function
{
    public bool operator()(MyClass lhs, MyClass rhs) 
    {   return /* determine if lhs < rhs */ ; }
}

vector objs;
std::sort(objs.begin(), objs.end(), LessThanMyClass());

}

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有