2013-03-27 164 views
0

我遇到了麻煩,每當我嘗試編譯這個程序時,我都會在contains函數中得到一個錯誤,它說q.pop。如果該行被註釋掉,它會很好地編譯,但它仍然會給出錯誤的值。由於某種原因,它總是虛假的。優先隊列錯誤

的錯誤是:
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

什麼是編譯器錯誤消息? – trojanfoe 2013-03-27 22:19:25

+0

您的代碼還有其他問題。例如,'qs'是'priority_queue ',但是你正在向它推送'int'(在'qs.push(i)'行)。 – 2013-03-27 22:24:01

回答

1

的問題是,你傳遞一個const參考隊列,但pop()顯然不是const操作,因爲它發生變異的隊列。

您應傳遞一個非const引用:

bool contains(priority_queue<T>& q, T val) { .... } 

正如你所看到的,你不能真正檢查隊列的內容,而不會改變它。

下一個錯誤是,你正在推動整成std::string隊列:

qi.push(i); 

你大概的意思

qi.push(arr[i]); 

注意您的隊列中ostream& operator<<超載清空隊列,因此,在將隊列打印到std::cout之後,如果嘗試使用contains,則無論隊列的原始內容如何,​​都會產生錯誤。

參見演示here

+0

另一個錯誤是'qs.push(i);''其中'i'是'int','qs'是'priority_queue '。 – Fraser 2013-03-27 22:23:41

+0

確定,工作正常,但現在它給我一個主要的錯誤,在它說priority_queue QS; – FJam 2013-03-27 22:24:12

+0

@FJam這將是因爲你在推動它。請參閱編輯。 – juanchopanza 2013-03-27 22:25:37

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查詢都將變爲false

您還在contains功能使用const priority_queue<T>&,然而,pop()功能不const,由juanchopanza指出,這會導致編譯錯誤。

0

我之前發表過評論,但是您的代碼還存在其他問題,不適合評論。

1)qspriority_queue<string>但你正在推動int s到它(在該行qs.push(i));我猜你想要做的是推arr[i]。因此,具有

qs.push(arr[i]); 

2)模板函數替換

qs.push(i); 

contains通過const引用採取priority_queue<T>。這意味着您無法撥打q上的非const方法。尤其是,您不能撥打q.pop(),因爲pop()是非常量方法。 (事實上​​,這種方法有望改變隊列)。因此,更換

template <typename T> 
bool contains(const priority_queue<T> &q, T val) { 

template <typename T> 
bool contains(priority_queue<T> &q, T val) {