首页 > 代码库 > C++ template--类模版Stack的实现

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


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



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