C++堆栈模板

C++ stack template

本文关键字:堆栈 C++      更新时间:2023-10-16

我为我的类制作了一个模板来模拟堆栈的基本功能,但我遇到了一个错误,我不知道如何修复它。

我的代码:

#using <mscorlib.dll>
using namespace System;
using namespace System::IO;
#include <iostream>
#include <vector>
using namespace std;
template<class T> 
class stack
{
    vector<T> *v;
    int n;
public:
    stack(int,vector<T>*);
    ~stack();
    void push(T);
    void pop();
    void afis();
};
template<class T> 
stack<T>::stack(int x, vector<T> *y)
{
    x = n;
    y = v;
}
template<class T> 
stack<T>::~stack()
{
}
template<class T> 
void stack<T>::push(T item)
{
    v->push_back(item);
}
template<class T> 
void stack<T>::pop()
{
    v->pop_back();
}
template<class T> 
void stack<T>::afis()
{
    typedef vector<T>::iterator it;
    for(it i = v->begin(); i != v->end(); ++i)
        cout << *i << " ";
}
int main()
{
    int n, nr;
    cin >> n;
    vector<int> v;
    for(int i = 0; i < n; i++)
    {
        cin >> nr;
        v.push_back(nr);
    }
    stack<int> st(n, &v);
    st.pop();
    st.afis();
}

错误发生在运行时,它说它访问内存时不应该访问。我还想知道我是否可以通过一个指针来声明我的堆栈,比如stack*st=new stack(n,&v)。这可能吗?

您的构造函数是向后的:

template<class T> 
stack<T>::stack(int x, vector<T> *y)
{
    n = x;
    v = y;
}

您的作业是向后的。

template<class T> 
stack<T>::stack(int x, vector<T> *y)
{
    x = n;
    y = v;
}

CCD_ 1和CCD_。它们的值是未定义的。

在编译时,可以使用初始化列表提醒您注意这些错误。

template<class T> 
stack<T>::stack(int x, vector<T> *y)
    : n(x), v(y)
{
}

构造函数中的赋值语句是向后的。

举个例子,假设我们有这样的类(这个类和你的类的区别是我删除了n变量,而我在向量v上没有指针)

template<class T> 
class stack
{
    vector<T> v;
public:
    stack(int,vector<T>*);
    ~stack();
    void push(T);
    void pop();
    void afis();
};

如果您尝试在变量v上不使用指针,那么您必须使用构造函数初始化列表,正如位掩码告诉您的那样。若并没有编写构造函数初始化列表,那个么就会出现编译错误。这是因为向量类有自己的构造函数,必须在stack类构造函数的主体之前执行,而唯一的位置是构造函数初始化列表。所以它会像:

   template<class T> 
stack<T>::stack():v(0)
{
}

这意味着您创建了具有0个元素的向量。

我认为,如果你尝试在main之外的其他函数中使用它,你的类就不会工作得那么好,但别介意!