簡體   English   中英

優先級隊列錯誤

[英]priority queue error

我遇到了麻煩,每當我嘗試編譯這個程序時,我在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;
 }

問題是你將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嘗試都會產生錯誤,無論隊列的原始內容如何。

在這里看演示。

您在代碼中有幾個問題:

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

你也使用const priority_queue<T>& in contains函數,但pop()函數不是const ,這導致juanchopanza指出的編譯錯誤。

我之前做過評論,但您的代碼還有其他問題,不適合評論。

1) qspriority_queue<string>但是你正在向它推送int (在qs.push(i) ); 我想你想要做的就是推動arr[i] 因此,替換

qs.push(i);

qs.push(arr[i]);

2)模板函數contains const引用的priority_queue<T> 這意味着你不能在q上調用非const方法。 特別是,你不能調用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) {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM