类模版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类型的函数代码。
注意:只有那些被调用的成员函数,才会产生这些函数的实例化代码。对于类模版,成员函数只有在被使用的时候才会被实例化。
时间: 2024-10-11 23:20:47