C++ 优先级队列错误
我遇到了麻烦,每当我试图编译这个程序时,我都会在contains函数中得到一个错误,其中显示q.pop。如果该行被注释掉,它将可以编译,但它仍然给出错误的值。出于某种原因,它总是错误的 错误是:C++ 优先级队列错误,c++,stl,priority-queue,C++,Stl,Priority Queue,我遇到了麻烦,每当我试图编译这个程序时,我都会在contains函数中得到一个错误,其中显示q.pop。如果该行被注释掉,它将可以编译,但它仍然给出错误的值。出于某种原因,它总是错误的 错误是: priority\u queue\u demo.cpp:在函数“int main()”中: 优先级\u队列\u demo.cpp:54:12:错误:从“int”到“const char*”的转换无效[-fppermissive] /usr/lib/gcc/x86_64-redhat-linux/4.6.
priority\u queue\u demo.cpp:在函数“int main()”中:
优先级\u队列\u demo.cpp:54:12:错误:从“int”到“const char*”的转换无效[-fppermissive]
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../../../../../include/c++/4.6.1/bits/basic_string.tcc:214:5:错误:初始化'std::basic_string::basic_string(const_CharT*,const_Alloc)][with _CharT=CharT,_Traits&=std::char Traits,_Alloc=std::char分配器].[-fpermissive]
priority_queue_demo.cpp:在函数“bool contains(const std::priority_queue&,T)[带T=int,typename std::vector::value_type=int]”中:
优先级队列演示。cpp:43:47:从此处实例化
priority_queue_demo.cpp:27:3:错误:将'const std::priority_queue'作为'void std::priority_queue::pop()[with _Tp=int,_Sequence=std::vector,_Compare=std::less]'的'this'参数传递将丢弃限定符[-fppermissive]
#包括
#包括
#包括
#包括
使用名称空间std;
模板
ostream&operator问题在于您正在向队列传递一个const
引用,但是pop()
显然不是const
操作,因为它会改变队列
您应该传递一个非常量引用:
bool contains(priority_queue<T>& q, T val) { .... }
你可能是说
qi.push(arr[i]);
注意您的ostream&operator过载代码中有几个问题:
priority_queue<string> qs;
for(int i = 0; i < ARR_SIZE; i++)
qs.push(i); //<<<<Error, should be arr[i]
priority_队列qs;
对于(int i=0;i qs.push(i)// 我以前做过一个评论,但是你的代码还有其他问题,这些问题不适合评论
1)qs
是一个priority_队列
,但您正在将int
s推送到它(在qs.push(i)
行中);我想你想做的是推arr[I]
。因此,替换
qs.push(i);
与
2)模板函数包含
按常量引用获取优先级队列
。这意味着您不能在q
上调用非const
方法。特别是,您不能调用q.pop()
,因为pop()
是一个非常量方法。(实际上,此方法预期会更改队列。)因此,替换
template <typename T>
bool contains(const priority_queue<T> &q, T val) {
模板
bool包含(常数优先级队列&q,T值){
与
模板
bool包含(优先级、队列和q、T值){
编译器错误消息是什么?您的代码还有其他问题。例如,qs
是一个priority\u队列
,但您正在将int
s推到它(在qs.push(i)
行中)。另一个错误是qs.push(i)
其中i
是一个int
和qs
是priority\u queue
。这很好,但现在它在主行中给了我一个错误,在主行中它说priority\u queue qs;@FJam,这可能是因为您正在将int推入其中。请参见编辑。是的,函数应该采用非常量引用。它的名称应该是更改为撕裂\u分开\u队列\u查找\u元素
。好的,谢谢,我让它工作了,但是contains函数仍然给我错误的答案。它对两个值都说false。
qs.push(i);
qs.push(arr[i]);
template <typename T>
bool contains(const priority_queue<T> &q, T val) {
template <typename T>
bool contains(priority_queue<T> &q, T val) {