2016-03-07 30 views
-1

所以,我想與建立成功,但運行失敗的堆棧

int x = 5; 
mystack<int> st; 
st.push(x); 

運行下面的類不過,我不斷收到建立失敗,我似乎無法找出原因。

#ifndef MYSTACK_H 
#define MYSTACK_H 
#include <vector> 
using namespace std; 

template<typename T> 
class mystack { 
private: 
    vector<T> data; 
    int size = 0; 
public: 
    void push(T const &); 
}; 

template<typename T> 
void mystack<T>::push(T const & elem) { 

    data[size] = elem; 
    size++; 
} 

運行失敗(退出值-1,073,741,819,總時間:1秒)


而且完全獨立的問題,我怎麼扔下溢?我試過

throw underflow_error(); 
+1

您的標題與您的問題主體不符。您的問題主體缺少相關的錯誤消息(請逐字逐句)。 – Mat

+0

標題說「構建成功」,問題表示「構建失敗」。這是什麼,錯誤狀態到底是什麼? – crashmstr

+2

您想添加'data.resize(size + 1);'作爲'push'的第一行。運算符'[]'沒有邊界檢查 –

回答

3

最初你的vector<T> data是空的。其size()爲0.您無法訪問其任何元素。這可能是得到錯誤的原因。

嘗試使用此代碼:

template<typename T> 
void mystack<T>::push(T const & elem) { 
    data.push_back(elem); 
} 

實際上,它會在您每次push元素時增加你data.size() 1。

不想使用任何載體STL

想知道你是有代碼vector<T>,看起來像STL。你可以使用普通的動態數組作爲替代或者甚至是靜態的。

template<typename T> 
class mystack { 
private: 
    T* data; 
    int size = 0; 
    int maxSize; 
public: 
    mystack(int maxSize) :maxSize(maxSize) { data = new data[maxSize]; } 
    ~mystack() { delete[] data; } 
    void push(T const &); 
}; 

template<typename T> 
void mystack<T>::push(T const & elem) { 
    // here you may check if you already reached the maxSize; 
    data[size++] = elem; 
} 

注意的是,爲了完全模擬STL向量的行爲,你應該考慮每一個你有size = allocateSize時間重新分配陣列。每當元素的數量達到2的冪次時,STL向量就會使它變大,它的尺寸加倍。

+0

不想使用任何矢量STL –

+4

@BrianJones但通過使用'std :: vector',你已經在使用STL。你想達到什麼目的? – stellarossa

+0

從頭開始我自己的Stack類,所以push_back會有點欺騙大聲笑。 –

0

我建議您使用std::stack而不是使用std::vector來實現您自己的堆棧。如果你不想使用STL,你應該自己控制內存分配和刪除。在您的示例中,在行data[size] = elem;中,您將值分配給未分配的內存,這是您的問題。您可以修復它的方式,如果你不希望使用push_back()方法:

template<typename T> 
void mystack<T>::push(T const & elem) { 
    size += 1; 
    data.resize(size); 
    data[size] = elem; 
} 

關於std::underflow_error。它設計用於算術下溢錯誤。無論如何,這個班有建設者,你應該把字符串,所以你需要改變throw underflow_error();throw underflow_error("Error message");

相關問題