2011-09-27 66 views
-1

如果我有這樣一類的頭文件如下:如何爲類對象預留向量空間?

class arrayStack 
{ 
    private: 
     struct StackNode 
    { 
    StackNode(int p, int v):previous(p),value(v){} 
    ~StackNode(){std::cout<<"destructor calledn"<<std::endl;} 
    int previous; 
    int value; 
    }; 

    public: 
    static const int STACKSIZE=100; 
    static const int NUMSTACK=3; 
    static int indexUsed; 
    arrayStack(); 
    ~arrayStack(); 
     void push(int stackNum, int val); 
    int top(int stackNum); 
    void pop(int stackNum); 
    bool isEmpty(int stackNum); 
    vector<StackNode*> buffer; 
     int stackPointer[NUMSTACK]; 
}; 

這裏是CPP文件的內容:

void arrayStack::push(int stackNum, int val) 
    { 
int lastIdx=stackPointer[stackNum]; 
stackPointer[stackNum]=indexUsed; 
indexUsed++; 
buffer[stackPointer[stackNum]]=new StackNode(lastIdx,val); 
    } 

    int arrayStack::top(int stackNum) 
    { 
return buffer[stackPointer[stackNum]]->value; 
    } 

基本上,我知道我需要存儲STACKSIZE * NUMSTACK StackNode *在矢量緩衝區(我知道我只是在這裏使用一個數組)。現在,我想知道如何在ctor中爲緩衝區預留足夠的空間。

這裏是我的嘗試:

buffer.reserve(STACKSIZE*NUMSTACK*sizeof(StackNode*)) 

,但它似乎沒有工作,因爲在客戶端的代碼,當我嘗試:

arrayStack tStack; 

for(int i=0;i<3;i++) 
    for(int j=0; j<10;j++) 
    { 
     tStack.push(i,i+j); 
    } 

程序崩潰是由於在標矢量分配。

+2

什麼'push'?此外,保留需要的元素數量,而不是以字節爲單位的內存量,所以你保留太多。 –

+0

爲什麼你需要存儲的指針在一個std :: vector的?值得注意的是,對於一個容器保留內存並不意味着你要構造這個數字元素,它只是一個預分配內存。 – cpx

回答

2

聽起來好像要使用resize功能,而不是reserve

此外,如在註釋所提到的,函數參數是元件的數量,而不是字節數。

如果你打電話buffer.resize(23),它會給你23個空指針,然後你就可以讀/用方括號修改載體。