2016-03-07 31 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");

相关问题