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;
 }
4

3 に答える 3

1

const問題は、キューへの参照を渡していることですが、キューを変更するため、pop()明らかにconst操作ではありません。

非 const 参照を渡す必要があります。

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

ご覧のとおり、変更せずにキューの内容を実際に確認することはできません。

次のエラーは、整数を のキューにプッシュしていることですstd::string:

qi.push(i);

あなたはおそらく意味します

qi.push(arr[i]);

for のオーバーロードはostream& operator<<キューを空にすることに注意containsしてください。そのため、キューを印刷した後に使用しようとするstd::coutと、キューの元の内容に関係なく false になります。

ここでデモを参照してください。

于 2013-03-27T22:21:12.597 に答える
1

コードにいくつかの問題があります。

priority_queue<string> qs;

    for(int i = 0; i < ARR_SIZE; i++)
            qs.push(i);  //<<<<Error, should be arr[i]

期待している間は整数であるため、実際にはプッシュしarr[i]ないでくださいiistring.

のすべての要素を削除する、オーバーロードされた演算子関数priority_queueへの参照渡しを渡すと、すべてのクエリが になります。<<priority_queuecontainsfalse

関数内でも使用const priority_queue<T>&containsますが、pop()関数は notconstであり、juanchopanza が指摘したようにコンパイル エラーが発生します。

于 2013-03-27T22:29:03.293 に答える
0

以前コメントしましたが、あなたのコードにはコメントに収まらない他の問題があります。

1) qsは aですが、(行で) s をpriority_queue<string>プッシュしています。あなたがやりたかったのは、プッシュすることだったと思います。したがって、intqs.push(i)arr[i]

qs.push(i);

qs.push(arr[i]);

2)テンプレート関数はconst 参照containsを受け取ります。priority_queue<T>つまり、 でconstメソッド以外を呼び出すことはできません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) {
于 2013-03-27T22:35:42.723 に答える