gpt4 book ai didi

c++ - 为什么函数比较器不能像在排序中那样在优先级队列中工作?

转载 作者:可可西里 更新时间:2023-11-01 18:31:22 30 4
gpt4 key购买 nike

我们有一个 question ,讨论了如何在 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;
}

错误:

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

那么,为什么不同?

最佳答案

您可以使用 std::priority_queue 的函数以及。您所做的不同之处在于您将函数传递给 std::sort作为函数参数,但您尝试将函数定义为队列的模板参数。这显然不起作用,因为第三个参数是错误解释的类型参数。此外,您甚至不能有指针或引用模板参数。

如果你看一下 reference ,你会发现队列有一个用于传递比较对象的构造函数。 这是您必须传递函数的地方。

std::sort有区别.排序是一个函数,你可以让编译器deduce它是模板参数,因此您不必明确指定它们。队列是一个类模板,不能推导类模板的模板参数(至少在这种情况下不能)。

模板参数默认为 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);

关于c++ - 为什么函数比较器不能像在排序中那样在优先级队列中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34850929/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com