所以,我试图用
运行下面的类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();
答案 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");
。