aza*_*zam 7 c++ sorting stl compare priority-queue
我们有一个问题,讨论如何priority_queue在C++中使用比较器.他给出了重载operator class(或struct)作为第三个参数,它工作正常.但bool功能不起作用.为什么?但它工作在罚款sort的<algorithm>.当我查看文档(priority_queue && algo/sort)时,它们都将其class Compare作为可选的第三个参数.
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
bool cmp (const int &a,const int &b){ return a > b; }
struct cmp2
{
bool operator() (const int &p1,const int &p2)
{
return p1 > p2;
}
};
int main ()
{
// freopen("test.txt","r",stdin);
int a[10];
vector<int> b(10);
sort( a , a + 10, cmp ); // working cool
sort( b.begin() , b.end() , cmp); // working great
priority_queue<int, vector<int> , cmp2 > x; // as usual, working....
priority_queue<int, vector<int> , cmp > y; // not working why ?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误:
A:\pqvsarray.cpp In function 'int main()':
27 40 A:\pqvsarray.cpp [Error] type/value mismatch at argument 3 in template parameter list for 'template<class _Tp, class _Sequence, class _Compare> class std::priority_queue'
27 40 A:\pqvsarray.cpp [Error] expected a type, got 'cmp'
27 43 A:\pqvsarray.cpp [Error] invalid type in declaration before ';' token
Run Code Online (Sandbox Code Playgroud)
那么,为什么差异呢?
你也可以使用一个函数std::priority_queue。您所做的不同之处在于您将函数std::sort作为函数参数传递给,但您尝试将该函数定义为队列的模板参数。这显然不起作用,因为第三个参数是错误解释的类型参数。此外,您甚至不能拥有指针或引用模板参数。
如果您查看参考,您会发现队列有一个用于传递比较对象的构造函数。这就是你必须传递函数的地方。
与 有区别std::sort。Sort 是一个函数,您可以让编译器推断出它的模板参数,因此您不必明确指定它们。队列是一个类模板,不能推导出类模板的模板参数(至少在这个上下文中不是)。
模板参数默认为std::less<typename Container::value_type>,但您不想使用它。因此,您必须明确指定比较对象的类型。您在现在尝试传递对象的位置指定它。如何获取函数指针/引用的类型,你可能会问。你可以这样说:decltype(&cmp)。如果您有一个不支持的过时编译器decltype,那么您需要指定没有它的类型:bool (&)(const int&, const int&)。
以下是如何创建使用您的函数的队列的示例。
std::priority_queue<int, std::vector<int>, decltype(&cmp)> x(cmp);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2527 次 |
| 最近记录: |