类模板+函数模板

    在c++中标准模板库主要由容器、算法和其他组件组成,将需要重复利用的功能以模板的形式封装。一般情况下,标准模板库中将算法实现为函数模板,而将容器实现为类模板。

    函数模板:使用函数模板可以重写通用函数。

    类模板:将类的成员类型参数化。

类模板code:

#include <iostream>
#include <stdio.h>
using namespace std;
/*******************************
**********定义类模板************
*******************************/

template<class T> class Stack
{
public:
	Stack(int = 12);		//类构造函数
	~Stack()				//类析构函数
	{
		delete [] stackPtr;
	}
	int push(const T&);		//入栈
	T pop();			//出栈
	int isEmpty() const		//栈是否为空
	{
		return top == -1;
	}
	int isFull() const		//栈是否已满
	{
		return top == size - 1;
	}
	int getSize() const		//获取栈的大小
	{
		return top + 1;
	}
private:
	int size;				//定义栈的大小
	int top;				//当前栈的位置
	T* stackPtr;			//栈的数据指针
};

/*******************************
******实现类模板的成员函数******
*******************************/

template<class T> Stack<T>::Stack(int iSize)		//定于构造函数,初始化堆栈的大小
{
	size = iSize > 0 && iSize < 100 ? iSize : 12;	//默认大小为12
	top = -1;										//初始化堆栈中没有数据
	stackPtr = new T[size];							//为堆栈分配空间
}

template<class T> int Stack<T>::push(const T &item)	//入栈函数
{
	if(!isFull())									//判断是否已满
	{
		stackPtr[++top] = item;						//入栈
		return 1;									//返回成功
	}
	return 0;										//否则返回失败
}

template<class T> T Stack<T>::pop()			//出栈函数
{
	if(!isEmpty())									//判断是否为空
	{
		T item = stackPtr[top--];						//出栈
		return item;								//返回成功
	}
	return -1;										//否则返回失败
}

/*******************************
*********实例化类模板***********
*******************************/

int main(int argc, char* argv[])
{
	typedef Stack<int> StackInt;
	StackInt s;
	for (int i = 0;i < 16;i++)
	{
		if(s.push(i) != 1)
		{
			cout << "添加第" << i+1 << "个元素时失败" << endl;
			break;
		}
	}
	int iCount = s.getSize();
	cout << "堆栈中有" << iCount << "个元素" << endl;
	while(!s.isEmpty())
	{
		cout << s.pop() <<endl;
	}
}

函数模板:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
/*******************************
*********定义函数模板***********
*******************************/

template <class T> T mint(T a,T b)
{
	return a < b ? a : b;
}

/*******************************
**********模板具体化************
*******************************/

char* mint(char* a, char* b)
{
	return strcmp(a,b) < 0 ? a : b;
}

/*******************************
*********使用函数模板***********
*******************************/

int main(int argc, char* argv[])
{
	//调用函数模板取最小整数值
	cout << mint(1234, 2345) << endl;
	//调用函数模板取最小符号值
	cout << mint('a', 'c') << endl;
	//调用函数模板取最小浮点值
	cout << mint(123.5, 32.5) << endl;
	//调用函数模板取最小字符串值
	cout << mint("Smith", "Jordan") << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/huanhuanxiaoxiao/article/details/79520462