Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;需要代码澄清_C++_Operator Overloading - Fatal编程技术网

C++ C++;需要代码澄清

C++ C++;需要代码澄清,c++,operator-overloading,C++,Operator Overloading,我试图理解下面的代码所说的内容: 结构比较 struct compare_pq { bool operator() (Events *& a, Events *& b); }; std::priority_queue<Events *, std::vector<Events *>, compare_pq> eventList; struct compare\u pq{ 布尔运算符()(事件*&a、事件*&b); }; std::优先级队列事件列

我试图理解下面的代码所说的内容:

结构比较

struct compare_pq {
    bool operator() (Events *& a, Events *& b);
};

std::priority_queue<Events *, std::vector<Events *>, compare_pq> eventList;
struct compare\u pq{
布尔运算符()(事件*&a、事件*&b);
};
std::优先级队列事件列表;
我查看了什么是优先级队列以及它是如何声明的,但无法理解
compare\u pq
在优先级队列
eventList
中做了什么。还有
operator()
做了什么,因为我以前从未见过
*&
和空操作符重载
operator()

任何帮助都将不胜感激。谢谢

操作符()
是函数调用操作符。它允许您像使用函数一样使用类类型的对象,例如

compare_pq my_comparator;
bool result = my_comparator(a, b);
重载
operator()
的类类型的对象通常称为函数对象或函子

std::priority_queue
的第三个模板参数用于比较函数。默认情况下,优先级队列使用
std::less
对其元素进行排序,这将应用
操作符
操作符()
作为函数调用操作符。它允许您像使用函数一样使用类类型的对象,例如

compare_pq my_comparator;
bool result = my_comparator(a, b);
重载
operator()
的类类型的对象通常称为函数对象或函子


std::priority_queue
的第三个模板参数用于比较函数。默认情况下,优先级队列使用
std::less
对其元素进行排序,这适用于
操作符*&是对指针的引用。它的工作原理与任何其他类型的引用一样。在不复杂的C++代码中,你可能会看到双指针(**)。
compare_pq是一个用于比较事件指针的函子。在这种情况下,优先级队列可能会在需要比较时实例化比较pq

Event * a = new Event();
Event * b = a;
compare_pq foo;
bool result = foo(a, b);

运算符()不是空的。你在看一份声明。如果要实例化它,必须在其他地方定义。

*&是指针的引用。它的工作原理与任何其他类型的引用一样。在不复杂的C++代码中,你可能会看到双指针(**)。 compare_pq是一个用于比较事件指针的函子。在这种情况下,优先级队列可能会在需要比较时实例化比较pq

Event * a = new Event();
Event * b = a;
compare_pq foo;
bool result = foo(a, b);

运算符()不是空的。你在看一份声明。如果要实例化它,必须在其他地方定义它。

我将尝试回答为什么使用函子的问题。当然,这只是一个猜测,因为我不是代码的作者,但我至少看到过几次关于它的讨论,而且一致的意见似乎是,函子支持或至少使内联比较代码更容易

函子是结构(或类),通常比常规函数更灵活,因为它们可以有一些成员,这些成员存储一些状态,运算符()可以使用这些状态。在本例中,这一优势没有被使用,因此functor很可能被用来在内联中启用(或帮助),或者仅仅因为作者已经习惯了这种常见模式

为什么它有助于内联?让我们看一个简单的例子。让我们采用
std::sort

template <class RandomAccessIterator, class Compare>
  void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
现在,您可以通过以下方式使用
sort
temeplate

sort(myvector.begin(), myvector.end(), MyStructComp1()); // 1
sort(myvector.begin(), myvector.end(), MyStructComp2()); // 2
sort(myvector.begin(), myvector.end(), myFunctComp1);  // 3
sort(myvector.begin(), myvector.end(), myFunctComp2);  // 4
以下是编译器从模板中创建的函数

sort<vector<int>::iterator, MyStrucComp1> // 1
sort<vector<int>::iterator, MyStrucComp2> // 2
sort<vector<int>::iterator, bool (*) (int lhs, int rhs)> // 3, // 4
你必须这样称呼它

sort<std::vector<int>::iterator, myFunctComp1>(myvector.begin(), myvector.end());
排序(myvector.begin(),myvector.end());

每个比较函数都会得到不同的排序,但是函子更方便。

我将尝试回答为什么使用函子的问题。当然,这只是一个猜测,因为我不是代码的作者,但我至少看到过几次关于它的讨论,而且一致的意见似乎是,函子支持或至少使内联比较代码更容易

函子是结构(或类),通常比常规函数更灵活,因为它们可以有一些成员,这些成员存储一些状态,运算符()可以使用这些状态。在本例中,这一优势没有被使用,因此functor很可能被用来在内联中启用(或帮助),或者仅仅因为作者已经习惯了这种常见模式

为什么它有助于内联?让我们看一个简单的例子。让我们采用
std::sort

template <class RandomAccessIterator, class Compare>
  void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
现在,您可以通过以下方式使用
sort
temeplate

sort(myvector.begin(), myvector.end(), MyStructComp1()); // 1
sort(myvector.begin(), myvector.end(), MyStructComp2()); // 2
sort(myvector.begin(), myvector.end(), myFunctComp1);  // 3
sort(myvector.begin(), myvector.end(), myFunctComp2);  // 4
以下是编译器从模板中创建的函数

sort<vector<int>::iterator, MyStrucComp1> // 1
sort<vector<int>::iterator, MyStrucComp2> // 2
sort<vector<int>::iterator, bool (*) (int lhs, int rhs)> // 3, // 4
你必须这样称呼它

sort<std::vector<int>::iterator, myFunctComp1>(myvector.begin(), myvector.end());
排序(myvector.begin(),myvector.end());

每个比较函数都会得到不同的排序,但函子更方便。

您应该使用标记代码语法而不是HTML
标记,因为
不启用语法着色,在其他问题中。感谢提示1。您应该使用标记代码语法而不是HTML
标记,因为
不启用语法着色,还有其他问题。感谢提示1+1:因为它只是一个指针,不应该通过值传递吗?事件*&引用指向对象的指针。HRM你能举一个它通常使用的例子吗?为什么一个结构被用来声明CopRayPQ?C++中指针的引用类似于C的指针指针。它允许您更改底层指针指向的对象。在比较器对象的情况下,它肯定应该通过值或常量引用进行传递,因为您可能不想更改指针指向的对象——只想读取它们。事实上,
操作符()()
也应该是
常量
成员,因此它甚至可以在采用
常量
(-reference)函数对象的算法上工作。@Billy:谢谢;这就是我的意思,但一点也不清楚@ke3pup:A
struct
相同,但其成员和基类在默认情况下是公共的,而不是私有的@WilhelmTell:操作员应该是const(和go)这一点很好