2012-09-12 52 views
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; 
} 

我已宣佈的代碼作爲全局變量外,butit can'see並說

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 ========== 

我真的無法理解這樣的行爲,請大家幫我澄清我做錯了

+1

什麼是line'vector &a(n);'應該這樣做? –

+0

http://www.scribd.com/doc/83085976/53/Program-20-10-Multiway-heap-PQ-implementation –

+0

除了在答案中指出的明顯問題,您正試圖初始化兩個不存在yout''pqi''構造函數中的成員變量,即''n''和''d''。 – juanchopanza

回答

2
vector<T>&a(n); 

這是什麼應該?你正在努力......什麼?這不是一個變量聲明,也不是一個函數聲明 - 即使它們是其中之一,n也不會在那裏。

+0

它是矢量的構造函數,我的意思是在插入操作期間 –

+0

@AleksiBeriashvili你不能聲明它*並且*在類中初始化它。任何狀況之下。 'vector &''是一個向量的**參考**。 – juanchopanza

+0

我檢查了您的鏈接,並明確了其中的代碼與您的鏈接不同。他們宣佈一個const矢量&a; NOT vector &a(n),它們在構造函數的初始化列表中初始化它,如下所示:a(a)。 – Borgleader

1
vector<T>&a(n); 

不知道你試圖用這個做的,但它看起來像你試圖初始化大小爲n的向量,你不能做的構造之外(因爲它不是靜態的)。

+0

請檢查我已發佈的鏈接 –

1

的問題是,

vector<T>&a(n); 

不初始化成員變量的正確方法。你應該使用這個構造函數。不過,我可以看到兩個似是而非的版本:

  1. 你實際上意味着vector<T> a;,即不是參考的載體。在這種情況下,你可以用一個整數初始化變量,像

    PQI勁永::():A(N){}

  2. 想一個向量的引用 - 在這種情況下, ,你需要用另一個向量初始化(引用不能被反彈,只有初始化),你可以傳遞給你的構造函數,如

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

+0

我有這樣的構造函數 –

相關問題