0

ここで私のコードでは、プログラムは n を変数にすることができず、なぜそれが起こるのか不思議です?

#include<iostream>
#include<vector>
using namespace std;
int d=3;
int n=12;

template<class T>
class pqi
{
    vector<int>pq;
    vector<int>qp;
    vector<T>&a(n);
    void exch(int i,int j)
    {
        int t=pq[i];
        pq[i]=pq[j];
        pq[j]=t;
        qp[pq[i]]=i;
        qp[pq[j]]=j;
    }
    void fixup(int k)
    {
        while(k>1 && a[pq[(k+d-2)/d]]>qp[pq[k]])
        {
            exch(k,(k+d-2)/d);k=(k+d-2)/d;
        }
    }
    void fixdown(int k,int n)
    {
        int j;
        while((j=d*(k-1)+2)<=n)
        {
            for(int i=j+1;i<j+d&& i<=n;i++)
                if(a[pq[j]]>a[pq[i]]) j=i;
            if(!(a[pq[k]]>a[pq[j]])) break;
            exch(k,j);k=j;
        }
    }
public:
    pqi(int n,const vector<T>&a,int d=3):a(a),pq(n+1,0),qp(n+1,0),n(0),d(d){}
    int empty() const
    {
        return n==0;
    }
    void insert(int v)
    {
        pq[++n]=v ;
        qp[v]=n;
        fixup(n);
    }
    int getmin()
    {
        exch(1,n);
        fixdown(1,n-1);
        return pq[--n];
    }
    void lower(int k)
    {
        fixup(qp[k]);
    }
};
int main()
{
    vector<int>s(n);
    pqi<int>a(n,s,d);
    for(int i=0;i<12;i++)
        a.insert(rand()%(RAND_MAX+i));
    while(!a.empty())
    {
        cout<<a.getmin()<<"  ";;
    }

    return 0;
}

コードの外側でグローバル変数として宣言しましたが、それを見ることができず、

1>c:\users\\documents\visual studio 2012\projects\multiway_heap\multiway_heap\multiway_heap.cpp(12): error C2061: syntax error : identifier 'n'
1>          c:\users\\documents\visual studio 2012\projects\multiway_heap\multiway_heap\multiway_heap.cpp(62) : see reference to class template instantiation 'pqi<T>' being compiled
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

本当に私はそのような振る舞いを理解できません。私が間違っていることを明確にするのを手伝ってください

4

3 に答える 3

2
 vector<T>&a(n);

これは何ですか?何をしようとしているのですか?それは変数宣言でも関数宣言でもありません。たとえそれがそれらのいずれであっても、nそこには場所がありません。

于 2012-09-12T10:21:30.290 に答える
1
vector<T>&a(n);

これで何をしようとしていたのかわかりませんが、コンストラクターの外では実行できないサイズ n でベクターを初期化しようとしていたようです (静的ではないため)。

于 2012-09-12T10:25:58.507 に答える
1

問題は、

vector<T>&a(n);

メンバー変数を初期化する正しい方法ではありません。これにはコンストラクターを使用する必要があります。ただし、もっともらしいバージョンが 2 つあります。

  1. vector<T> a;つまり、ベクトルへの参照ではありません。この場合、次のように変数を整数で初期化できます。

    pqi::pqi() : a( n ) { }

  2. ベクトルへの参照が必要です-その場合、次のようにコンストラクターに渡すことができる別のベクトルで初期化する必要があります(参照は再バインドできず、初期化のみされます)。

    pqi::pqi( std::vector &v ) : a( v ) { }

于 2012-09-12T10:27:58.077 に答える