我遇到了麻烦,每当我尝试编译这个程序时,我在包含q.pop的contains函数中都会出错。如果该行被注释掉它将编译正常,但它仍然给出错误的值。由于某种原因,它总是假的。
错误是:
priority_queue_demo.cpp: In function 'int main()':
priority_queue_demo.cpp:54:12: error: invalid conversion from 'int' to 'const char*' [-fpermissive]
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/bits/basic_string.tcc:214:5: error: initializing argument 1 of 'std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' [-fpermissive]
priority_queue_demo.cpp: In function 'bool contains(const std::priority_queue<T>&, T) [with T = int, typename std::vector<T, std::allocator<_Tp1> >::value_type = int]':
priority_queue_demo.cpp:43:47: instantiated from here
priority_queue_demo.cpp:27:3: error: passing 'const std::priority_queue<int>' as 'this' argument of 'void std::priority_queue<_Tp, _Sequence, _Compare>::pop() [with _Tp = int, _Sequence = std::vector<int, std::allocator<int> >, _Compare = std::less<int>]' discards qualifiers [-fpermissive]
#include <iostream>
#include <string>
#include <sstream>
#include <queue>
using namespace std;
template <typename T>
ostream &operator <<(ostream &os, priority_queue<T> &q) {
os << "{";
while (!q.empty()) {
os << q.top() << (!q.empty() ? ", " : "");
q.pop();
}
os << "}";
return os;
}
template <typename T>
bool contains(const priority_queue<T> &q, T val) {
for (int i = 0; i < q.size(); i++) {
if (q.top() == val) return true;
q.pop();
}
return false;
}
int main() {
cout << boolalpha;
priority_queue<int> qi;
for (int i = 0; i < 20; i++)
qi.push(i);
cout << qi << endl;
cout << "qi contians 15: " << contains(qi, 15) << endl;
cout << "qi contians 23: " << contains(qi, 23) << endl;
const int ARR_SIZE = 4;
string arr[ARR_SIZE] = {"cat", "dog", "cow", "elephant"};
cout << endl;
priority_queue<string> qs;
for(int i = 0; i < ARR_SIZE; i++)
qs.push(i);
cout << qs << endl;
while(!qs.empty()) {
qs.pop();
cout << qs << endl;
}
return 0;
}
答案 0 :(得分:1)
问题是您正在向队列传递const
引用,但pop()
显然不是const
操作,因为它会改变队列。
你应该传递一个非const引用:
bool contains(priority_queue<T>& q, T val) { .... }
正如您所看到的,如果不改变队列,您就无法真正检查队列的内容。
下一个错误是您将整数推送到std::string
:
qi.push(i);
你可能意味着
qi.push(arr[i]);
注意队列ostream& operator<<
的重载会清空队列,因此在将队列打印到contains
后尝试使用std::cout
将产生错误,无论如何队列的原始内容。
请参阅演示here。
答案 1 :(得分:1)
您在代码中遇到了几个问题:
priority_queue<string> qs;
for(int i = 0; i < ARR_SIZE; i++)
qs.push(i); //<<<<Error, should be arr[i]
你真的应该推arr[i]
而不是i
,因为i
是整数,而它期望string.
您通过引用将priority_queue
传递给重载的<<
运算符函数,该函数会删除priority_queue
中的所有元素,因此您的所有contains
查询都将变为{{ 1}}。
您还在false
函数中使用const priority_queue<T>&
,但contains
函数不是pop()
,这会导致juanchopanza指出的编译错误。
答案 2 :(得分:0)
之前我发表过评论,但您的代码还有其他问题,不适合评论。
1) qs
是priority_queue<string>
,但您正在推送int
s(在qs.push(i)
行中);我想你想要做的就是推arr[i]
。因此,替换
qs.push(i);
与
qs.push(arr[i]);
2)模板函数contains
通过const引用获取priority_queue<T>
。这意味着您无法在const
上调用非q
方法。特别是,您无法调用q.pop()
,因为pop()
是非const方法。 (实际上,这种方法有望改变队列。)因此,替换
template <typename T>
bool contains(const priority_queue<T> &q, T val) {
与
template <typename T>
bool contains(priority_queue<T> &q, T val) {