当前位置: 首页 > 知识库问答 >
问题:

运算符重载“Operator()”

司徒俊雄
2023-03-14

我正在实现Dijkstra的算法,我想使用STL的“priority_queue”来加快编码过程,但是就像我尝试用C语言编码时经常遇到的情况一样,我对语言的理解不足正在减缓我的速度。我在http://www.cplusplus.com/reference/stl/priority_queue/priority_queue/找到了这个例子,但不明白下面是做什么的:

// constructing priority queues
#include <iostream>
#include <queue>
using namespace std;

class mycomparison
{
  bool reverse;
public:
  mycomparison(const bool& revparam=false)
    {reverse=revparam;}
  bool operator() (const int& lhs, const int&rhs) const
  {
    if (reverse) return (lhs>rhs);
    else return (lhs<rhs);
  }
};

int main ()
{
  int myints[]= {10,60,50,20};

  priority_queue<int> first;
  priority_queue<int> second (myints,myints+4);
  priority_queue< int, vector<int>, greater<int> > third (myints,myints+4);

  // using mycomparison:
  priority_queue< int, vector<int>, mycomparison > fourth;

  typedef priority_queue<int,vector<int>,mycomparison> mypq_type;
  mypq_type fifth (mycomparison());
  mypq_type sixth (mycomparison(true));

  return 0;
}

更具体地说,“bool运算符()(const int

共有3个答案

杨乐
2023-03-14
bool operator () ( const int &, const int & );

这是一个函数,是一个重载的操作符(),它接受两个整数并返回一个布尔值const表示无法更改该值。它代表常量

翟俊哲
2023-03-14

这是函数调用操作符,您可以这样使用它:

mycomparison mycomp;  //defines an object
mycomp(1,2);  // invokes operator()(int,int)
徐秋月
2023-03-14

本质上,operator()只是另一个可以重载的操作符,因此您所知道的关于操作符重载的一切仍然适用-它很有用,因为它可以应用于具有与调用函数相同语法的对象,例如。

MyClass f;
f(); // i.e. f.operator()();

也就是说,有很多关于函数等的东西可以说。除此之外——你可能想在谷歌上搜索函数/函数对象以获得更多信息。这里有一个链接:

http://en.wikipedia.org/wiki/Function_object

在上面的代码中,priority\u queue接受一个比较函子,它使用该函子对您放入队列的内容进行排序。第一个队列(fifth)使用正常排序;第二个队列(sixth)使用反向排序。

 类似资料:
  • Rust可以让我们对某些运算符进行重载,这其中大部分的重载都是对std::ops下的trait进行重载而实现的。 重载加法 我们现在来实现一个只支持加法的阉割版复数: use std::ops::Add; #[derive(Debug)] struct Complex { a: f64, b: f64, } impl Add for Complex { type Outpu

  • 问题内容: 我知道golang不会提供运算符重载,因为它认为这会增加复杂性。 所以我想直接对结构实现。 https://play.golang.org/p/1U8omyF8-V 通过上面的代码, AddValue 可以按我的方式工作。但是,我唯一关心的是它是按值传递的,因此我每次必须返回新添加的值。 还有其他更好的方法,以避免返回汇总变量。 问题答案: 是的,使用指针接收器: 通过使用指针接收器,

  • 问题内容: 我已经使用JavaScript了几天,现在我想为定义的对象重载运算符。 在Google搜索了一段时间后,您似乎无法正式执行此操作,但是仍有一些人声称采取了一些漫长的方法来执行此操作。 基本上,我制作了Vector2类,并希望能够执行以下操作: 相反,我必须这样做: 我可以采用什么方法在Vector2类中重载运算符?因为这看起来很丑陋。 问题答案: 如您所见,JavaScript不支持运

  • 问题内容: 之间有什么区别 和 在TensorFlow中?用代替构造图形时,计算图形会有什么不同? 更一般而言, 张量或其他运算是否过载? 问题答案: 如果或中的至少一个是对象,则表达式和是等效的。您可能使用的主要原因是为创建的op指定一个显式的关键字参数,这对于重载的运算符版本是不可能的。 请注意,如果也不是(例如,如果它们是NumPy数组),那么将不会创建TensorFlow op。总是创建一

  • 主要内容:运算符重载的实现,可重载与不可重载的运算符C# 中支持运算符重载,所谓运算符重载就是我们可以使用自定义类型来重新定义 C# 中大多数运算符的功能。运算符重载需要通过 operator 关键字后跟运算符的形式来定义的,我们可以将被重新定义的运算符看作是具有特殊名称的函数,与其他函数一样,该函数也有返回值类型和参数列表,如下例所示: public static Box operator+ (Box b, Box c) {     Box bo

  • 本文向大家介绍c++ *运算符重载,包括了c++ *运算符重载的使用技巧和注意事项,需要的朋友参考一下 运算符重载,对象和指向对象的指针 直接上code 运行结果: t是指向test对象的指针,(*t) 也就是一个test对象。 所以只有 *t才真正的调用了 运算符的重载函数。