构建成功但是Stack类失败

时间:2016-03-07 19:11:21

标签: c++

所以,我试图用

运行下面的类
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++;
}

RUN FAILED(退出值-1,073,741,819,总时间:1s)

同样完全独立的问题,我如何抛出下溢?我试过了

throw underflow_error();

2 个答案:

答案 0 :(得分:3)

最初,您的vector<T> data为空。其size()为0.您无法访问其任何元素。这可能是导致错误的原因。

尝试使用此代码:

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

每次data.size()元素时,它实际上会将push增加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向量就会产生这种情况,它的大小就会翻倍。

答案 1 :(得分: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");