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:Astruct
与类
相同,但其成员和基类在默认情况下是公共的,而不是私有的@WilhelmTell:操作员应该是const(和go)这一点很好