[基本上,我需要一种以统一的方式创建比较器的方法,以便在sort()
函数和优先级队列中进行比较。也将更容易记住。
我的疑问是,为什么优先级队列使用“ Comp”,而排序使用“ Comp()”。还有其他方法可以使两者使用相同的格式吗?请讲一些标准方法。谢谢。
我正在尝试比较这个问题中的课程:https://practice.geeksforgeeks.org/problems/minimum-platforms/0。
代码:https://ide.geeksforgeeks.org/R8snxdJl1B。
// constructing priority queues
#include <iostream> // std::cout
#include <queue> // std::priority_queue
#include <vector> // std::vector
#include <functional> // std::greater
#include <algorithm>
using namespace std;
class Comp{
public:
bool operator() (const int& lhs, const int&rhs) const{
return (lhs>rhs);
}
};
int main (){
int myints[]= {10,60,50,20};
// using mycomparison:
priority_queue<int, vector<int>, Comp> pq;
cout << "pq is using mycomparison" << endl;
vector<int> v= {10,60,50,20};
sort(v.begin(), v.end(), Comp());
cout << "sort using mycomparison()" << endl;
return 0;
}
为什么优先级队列使用“ Comp”,而排序使用“ Comp()”
priority_queue
是类型,sort
是函数。函数可以推断模板参数,但是默认构造的类型没有参数可以推断类型。
如果调用构造函数,则C ++ 17的模板推导指南将允许您使用Comp()
形式:
std::priority_queue pq{Comp(), std::vector<int>()};
如果只有C ++ 11或14,则可以编写一个帮助程序函数以使用自定义比较器来构建一个:
template<typename T, typename Container = std::vector<T>, typename Comp>
std::priority_queue<T, Container, Comp> make_priority_queue(Comp comp) {
return std::priority_queue<T, Container, Comp>{comp};
}
用作
auto pq = make_priority_queue<int>(Comp());
代替lambda,而不是土布函子。它们简单得多,并且对两者都有效。语法上的任何其他差异只是std::sort
和std::priority_queue
的设计方式。但是,您不必记住Comp()
与Comp
。
#include <algorithm> // std::sort
#include <array>
#include <iostream> // std::cout
#include <queue> // std::priority_queue
#include <vector> // std::vector
int main() {
// Lambda instead of functor
constexpr auto Comp = [](auto& lhs, auto& rhs) { return lhs > rhs; };
// std::array as an iterable type for priority_queue
std::array<int, 4> myints = {10, 60, 50, 20};
// using mycomparison:
// As someone else stated, you can leave all this template stuff out in C++17
// std::priority_queue pq(Comp, myints);
std::priority_queue<int, decltype(myints), decltype(Comp)> pq(Comp, myints);
std::cout << "pq is using mycomparison" << std::endl;
std::vector<int> v = {10, 60, 50, 20};
std::sort(v.begin(), v.end(), Comp);
std::cout << "sort using mycomparison()" << std::endl;
return 0;
}
我也删除了using namespace std;
行,因为这是一个不好的做法。如果您不喜欢std::
的全部内容,则可以改用using
语句。
using std::cout;
using std::vector;
// etc.