码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-08-31 15:55:21      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:c++   stl      vector   


类模版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的实现

标签:c++   stl      vector   

原文地址:http://blog.csdn.net/lanzhihui_10086/article/details/38959863

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!