Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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++中使用一个比较器。他给出了重载的操作符类(或结构)作为第三个参数,它工作正常。但是bool函数不起作用。为什么?但是它在&&&>的排序中工作得很好,它们都将类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; } #包括 #包括 #包括 #包括 #包括 使用名称空间std; boolcmp(常数int&a,常数int&b){返回a>b;} 结构cmp2 { 布尔运算符() { 返回p1>p2; } }; int main() { //freopen(“test.txt”、“r”、stdin); INTA[10]; 载体b(10); 排序(a,a+10,cmp);//工作正常 排序(b.begin(),b.end(),cmp);//工作得很好 优先级\u队列x;//像往常一样,正在工作。。。。 优先级队列y;//不工作为什么? 返回0; }_C++_Sorting_Stl_Compare_Priority Queue - Fatal编程技术网 b;} 结构cmp2 { 布尔运算符() { 返回p1>p2; } }; int main() { //freopen(“test.txt”、“r”、stdin); INTA[10]; 载体b(10); 排序(a,a+10,cmp);//工作正常 排序(b.begin(),b.end(),cmp);//工作得很好 优先级\u队列x;//像往常一样,正在工作。。。。 优先级队列y;//不工作为什么? 返回0; },c++,sorting,stl,compare,priority-queue,C++,Sorting,Stl,Compare,Priority Queue" /> b;} 结构cmp2 { 布尔运算符() { 返回p1>p2; } }; int main() { //freopen(“test.txt”、“r”、stdin); INTA[10]; 载体b(10); 排序(a,a+10,cmp);//工作正常 排序(b.begin(),b.end(),cmp);//工作得很好 优先级\u队列x;//像往常一样,正在工作。。。。 优先级队列y;//不工作为什么? 返回0; },c++,sorting,stl,compare,priority-queue,C++,Sorting,Stl,Compare,Priority Queue" />

为什么函数比较器不';在优先级队列中不能像在排序中那样工作? 我们讨论了如何在C++中使用一个比较器。他给出了重载的操作符类(或结构)作为第三个参数,它工作正常。但是bool函数不起作用。为什么?但是它在&&&>的排序中工作得很好,它们都将类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; } #包括 #包括 #包括 #包括 #包括 使用名称空间std; boolcmp(常数int&a,常数int&b){返回a>b;} 结构cmp2 { 布尔运算符() { 返回p1>p2; } }; int main() { //freopen(“test.txt”、“r”、stdin); INTA[10]; 载体b(10); 排序(a,a+10,cmp);//工作正常 排序(b.begin(),b.end(),cmp);//工作得很好 优先级\u队列x;//像往常一样,正在工作。。。。 优先级队列y;//不工作为什么? 返回0; }

为什么函数比较器不';在优先级队列中不能像在排序中那样工作? 我们讨论了如何在C++中使用一个比较器。他给出了重载的操作符类(或结构)作为第三个参数,它工作正常。但是bool函数不起作用。为什么?但是它在&&&>的排序中工作得很好,它们都将类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; } #包括 #包括 #包括 #包括 #包括 使用名称空间std; boolcmp(常数int&a,常数int&b){返回a>b;} 结构cmp2 { 布尔运算符() { 返回p1>p2; } }; int main() { //freopen(“test.txt”、“r”、stdin); INTA[10]; 载体b(10); 排序(a,a+10,cmp);//工作正常 排序(b.begin(),b.end(),cmp);//工作得很好 优先级\u队列x;//像往常一样,正在工作。。。。 优先级队列y;//不工作为什么? 返回0; },c++,sorting,stl,compare,priority-queue,C++,Sorting,Stl,Compare,Priority Queue,错误: 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:\p

错误:

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
A:\pqvsarray.cpp在函数“int main()”中:
27 40 A:\pqvsarray.cpp[Error]类型/值在“模板类std::priority\u队列”的模板参数列表中的参数3处不匹配
27 40 A:\pqvsarray.cpp[错误]应为类型,获得“cmp”
27 43 A:\pqvsarray.cpp[错误]在“;”之前的声明中的类型无效代币

那么,为什么会有差异呢?

答案在于编译器错误。
优先级队列的第三个模板参数是比较器类型(如结构或类),而不是函数。

正如错误消息所暗示的,函数不能用作模板参数。
优先级队列
将复制比较类型的对象。例如,这可能是
std::less
,其中该类型的对象是
std::less()
,正在调用的对象是
std::less()(x,y)
。在C++11中,您可以使用
decltype
,但在C++03中,“规范”的方法是创建一个“functor”(专门用作函数对象的整个类型)。这是创建的原因之一。

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

std::priority_queue<int, std::vector<int>, decltype(&cmp)> x(cmp);
如果查看,您会发现队列有一个用于传递比较对象的构造函数。这就是你必须传递函数的地方

std::priority_queue<int, std::vector<int>, decltype(&cmp)> x(cmp);
std::sort
不同。Sort是一个函数,您可以让编译器使用它的模板参数,这样就不必显式地指定它们。队列是一个类模板,并且不能推断类模板的模板参数(至少在此上下文中不能)

模板参数默认为
std::less
,但您不想使用它。因此,必须明确指定比较对象的类型。您可以在现在尝试传递对象的位置指定它。您可能会问,如何获取函数指针/引用的类型。您可以这样做:
decltype(&cmp)
。如果您有一个过时的编译器不支持
decltype
,那么您需要指定没有它的类型:
bool(&)(const int&,const int&)

下面是如何创建使用函数的队列的示例

std::priority_queue<int, std::vector<int>, decltype(&cmp)> x(cmp);
std::优先级队列x(cmp);

因为优先级队列模板需要一个类型,但你给它一个函数指针。那么,
排序
如何/为什么取一个
函数指针呢?@SelçukCihan根据,它可以是函数指针:这可以是函数指针,也可以是函数object@azam因为在sort中,您实际上是在调用一个方法。但是,对于priority_队列,您要做的是通过提供模板参数来指定您想要的优先级队列的类型。这就是区别。根据,应该可以使用函数。@Aracthor:是的。你只需要把正确的论点传递到正确的地方。将函数指针的类型作为
priority\u queue
的模板参数传递,并将实际函数指针作为参数传递给构造函数。这与使用
std::sort
时的情况完全相同,不同的是,类型是推断的,您可以通过调用函数模板(如
std::sort
)来实现,但不能通过类模板对象的实例化(如
std::priority\u queue
)来实现。如果您对“为什么?”。但是,谢谢!是的,
bool(&)(const int&,const int&)<第三代码的代码> <代码> >代码11 >代码11 >如果不是我的错,则是C++中的.+代码解释得好。+ C++,代码< >代码> <代码>确实被添加到C++ 11中。很好,用于发现C++的不足,并解释了C++中代码< LAMBDA > /Cult> S的出现原因。