C++ 模板探究

函数的重载可以实现具有相同功能的函数的函数名相同,但是书写函数的个数并没有减少,重载的代码几乎一样。c++提供了模板就是解决了程序代码重用性差,存在大量的冗余信息这个问题。

 

首先看函数模板:

该函数模板实现利用冒泡来排序

/********************c++模板实现冒泡排序*******************************/
#include<iostream>
using namespace std;
template<class T>
//该函数可实现从大到小排序和从小到大排序,默认是从小到大排序,最后一个参数表示是何种排序
void sort(T *a,int n,bool p=false)
{
	bool flag= false;// 程序迭代停止的标志位,如果for循环执行了一遍后,标志位没有改变,说明此时数组的顺序不需要改动,排序已经完成
	T t;//临时变量,用于两个数据交换时的中间变量
	while (true)
	{
		flag = false; 
		//从大到小排序
		if (p == true)
		{
			for (int i = 0; i < n - 1; i++)
			{
				if (a[i] < a[i + 1])
				{
					flag = true;
					t = a[i + 1];
					a[i + 1] = a[i];
					a[i] = t;
				}
			}
		}
		//从小到大排序
		if(p==false)
		{
			for (int i = 0; i < n - 1; i++)
			{
				if (a[i] > a[i + 1])
				{
					flag = true;
					t = a[i + 1];
					a[i + 1] = a[i];
					a[i] = t;
				}
			}
		}
		
		n = n - 1;//因为每一次循环后大的那个数就到最后面了,所以不用全部遍历
		if (flag == false)
			break;			
	}
}
void main()
{
	int a[7] = { 2,5,1,8,3,6,4};
	double k[7] = { 2.3,4.1,1.2,9.8,6.3,3.4,0.3 };
	sort(a, 7);
	sort(k, 7,true);
	for (int i = 0; i < 7; i++)
	{
		cout << a[i] << endl;
	}
	for (int i = 0; i < 7; i++)
	{
		cout << k[i] << endl;
	}

这是程序运行结果,可以实现对int类型和double的排序,int从小到大排序,double从大到小排序。

C++ 模板探究

 

类模板实现堆栈出栈的过程

头文件 stact.h  (为了防止与自带的stack冲突,就命名为stact了).,当然了这个程序考虑的情况比较少,没有考虑到内存分配失败一些问题,仅仅是对阐述类模板做个记录

#pragma once
#ifndef STACT_H_
#define STACT_H_
template<typename T>
class stact
{
public:
	//构造函数,初始化
	stact()
	{
		stactsize = 10;
		base = new T[stactsize];//
		p = base;//
	}
	// 返回栈的顶元素
	T top()
	{
		if ((p - base) != 0)
		{
			T e = *(p - 1);
			return e;
		}
		else
			return *p-1;
	}
	//往栈中添加元素
	bool push(T a)
	{
		//这里首先需要判断栈中是否已满,如果已满需要重新分配内存
		if (p - base == stactsize)
		{
			cout << "man" << endl;
			T *newbase = new T[stactsize*2];
			for (int i = 0; i < stactsize; i++)
			{
				newbase[i] = base[i];
			}
			base = newbase;
			p = base + stactsize;
			stactsize = stactsize * 2;
			delete[]base;
		}
		*(p++) = a;
		//cout << "base=" << *base << endl;

		return true;
		
	}
	//删除栈顶元素
	void pop()
	{
		if ((p - base) != 0)
				{
					p--;
				}
	}
	//获得栈的元素个数
	int getsize()
	{
		int size = p - base;
		return size;
	}

private:
	T *base; //栈存储空间的基址
	T *p; //栈顶地址
	int stactsize;//栈的存储容量
};
#endif;

main.cpp

#include<iostream>
#include"stact.h"
using namespace std;
template<typename T>

	stact<int>w;
	for (int i = 0; i < 100; i++)
	{
		w.push(i);//添加元素
	};
		
	w.pop();//删除栈顶元素
	int a = w.top();
	cout << "栈顶元素是="<<a<<endl;
	cout << "栈顶元素个数="<<w.getsize()<<endl;
}

 

先往栈中添加元素,在删除栈顶元素,得到以下结果。

C++ 模板探究