首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函子类型与operator<的比较

函子类型与operator<的比较
EN

Stack Overflow用户
提问于 2008-10-08 16:17:28
回答 7查看 9.2K关注 0票数 10

谷歌C++风格指南中,操作员超载一节建议不要超载任何操作符(“除非在罕见的特殊情况下”)。具体而言,委员会建议:

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

我有点模糊这样的函子会是什么样子,但我的主要问题是,你为什么要为这个写你自己的函子?定义operator<和使用标准的std::less<T>函数不是更简单吗?用一种比另一种有什么好处?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-10-08 16:32:55

除了最基本的类型之外,较少的操作并不总是琐碎的,甚至平等也可能因情况而异。

想象一下,一家航空公司想给所有乘客分配登机号码。这个数字反映了登机令(当然)。现在,是什么决定了谁先于谁?您可以采取客户注册的顺序--在这种情况下,少于操作的用户将比较签入时间。你也可以考虑顾客为他们的机票支付的价格--比现在的票价要低。

…诸若此类。总之,在operator <类上定义一个Passenger是没有意义的,尽管它可能需要在一个排序的容器中有乘客。我认为这正是谷歌所警告的。

票数 16
EN

Stack Overflow用户

发布于 2008-10-08 16:54:00

通常,定义operator<更好、更简单。

要使用函子的情况是需要多种方法来比较特定的类型。例如:

代码语言:javascript
运行
复制
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

通常情况下,问题在于定义函子是由类的用户决定的,因此当类需要在有序容器中使用时,您往往会得到对同一事物的许多重新定义。

票数 6
EN

Stack Overflow用户

发布于 2008-10-08 16:29:05

好吧,根据你引用的网页,函子没有多大优势(“操作人员可以欺骗我们的直觉,认为昂贵的操作是廉价的、内置的操作”)。

我的感觉是,一个人应该努力使你尽可能地将一流的对象分类,对我来说,这意味着让他们理解尽可能多的操作人员。

我已经有一段时间没有写函子了,但是它看起来是这样的:

代码语言:javascript
运行
复制
class MyClass {....}

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

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

}

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/183606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档