C++ template--类模版Stack的实现

来源:互联网 发布:质量数据分析管理办法 编辑:程序博客网 时间:2024/06/10 07:05


类模版Stack的实现

//stack1.hpp#include<vector>#include<stdexcept>using namespace std;template <typename T>class Stack{private:vector<T> elems;public:void push(T const&);void pop();T top() const;bool empty() const{return elems.empty();}};template <typename T>void Stack<T>::push(T const &elem){elems.push_back(elem);//vector里面最后添加一个,即栈顶添加一个元素}template <typename T>void Stack<T>::pop(){if(elems.empty()){throw out_of_range("Stack<>::pop():empty stack");}elems.pop_back();//vector里面移除最后一个元素,即移除栈顶元素}template <typename T>T Stack<T>::top() const{if(elems.empty()){throw out_of_range("Stack<>::top():empty stack");}return elems.back();//vector里面返回最末一个元素,即stack里面的栈顶元素}

可以看出,类模版Stack<>是通过C++标准库的类模版vector<>来实现的,因此,我们不需要亲自去实现内存管理,拷贝构造函数和赋值运算符,从而可以把精力放在该模板类的接口实现上。

//main.cpp//类模版Stack实现#include<iostream>#include<string>#include<vector>#include"stack1.hpp"using namespace std;int main(){Stack<int>  intStack;//使用int桟cout<<"使用int桟"<<endl;for(int i=1;i<6;i++)intStack.push(i);while(!intStack.empty()){cout<<intStack.top()<<" ";intStack.pop();}cout<<endl;Stack<string> stringStack;cout<<"请输入string(#退出):";string str;while(cin>>str){if(str=="#")break;stringStack.push(str);}while(!stringStack.empty()){cout<<stringStack.top()<<" ";stringStack.pop();}cout<<endl;system("pause");return 0;}


通过声明类型Stack<int>,在类模版内部就可以用int实例化T,因此,intSatck是一个创建自Stack<int>的对象,它的元素储存于vector,且为int。

对于所有被调用的成员函数,都会实例化出基于int类型的函数代码。
注意:只有那些被调用的成员函数,才会产生这些函数的实例化代码。对于类模版,成员函数只有在被使用的时候才会被实例化。



3 0
原创粉丝点击