【C++】【STL】STL学习之旅二:模板
2014-10-12 08:13
323 查看
模板提供了通用的方法来开发可重用代码,可以创建参数化的C++类型。模板可分为:函数模板和类模板。
函数模板的用法同C++预处理器的用法有一定的类似之处,它们都提供编译代码过程中的文本替换功能,但前者可以对类型进行一定的保护。
使用类模板可以编写通用的、类型安全的类。STL中仍然要用到函数模板和类模板。
实例:
/*************************************************************************
* *
* 编制动态数组的模板类 *
* *
*************************************************************************/
#include<iostream.h>
template<class T>
class MyArray
{
private:
int m_nTotalSize;//数组总长度
int m_nValidSize;//数组有效长度,即当前数组的最后一个元素下标+1
T* m_pData;//数据
public:
MyArray(int nSize=3)//数组默认总长度为3
{
m_pData=new T[nSize];
m_nTotalSize=nSize;
m_nValidSize=0;
}
~MyArray()
{
if(m_pData!=NULL)//判断是否为空,如果已经释放,则不再释放了。
//避免对同一内存释放两次
{
delete []m_pData;
m_pData=NULL;
}
}
//想m_pData添加数据
void Add(T value)
{
if(m_nValidSize<m_nTotalSize)//如果有效长度小于总长度
{
m_pData[m_nValidSize]=value;
m_nValidSize++;
}
else//有效长度大于总长度,此时要进行数组扩展
{
T* tmpData=new T[m_nTotalSize];//原始数据备份
for(int i=0;i<m_nTotalSize;i++)
{
tmpData[i]=m_pData[i];
}
delete []m_pData;//释放原始数据内存空间
m_nTotalSize=m_nTotalSize*2;//原始数据空间重新分配,空间扩大1倍
m_pData=new T[m_nTotalSize];
//传回备份数据
for(i=0;i<m_nValidSize;i++)
{
m_pData[i]=tmpData[i];
}
delete []tmpData;//释放备份数据内存空间
m_pData[m_nValidSize]=value;
m_nValidSize++;
}
}
//返回数组的有效长度
int GetSize()const
{
return m_nValidSize;
}
//返回某一位置元素
T Get(int pos)const
{
return m_pData[pos];
}
//返回数组
T* GetArray()const
{
return m_pData;
}
};
template<class T>
T sum(T data[],int nSize);
void main()
{
MyArray<int> obj;
obj.Add(1);
obj.Add(2);
obj.Add(3);
obj.Add(4);
for(int i=0;i<obj.GetSize();i++)
{
cout<<obj.Get(i)<<endl;
}
cout<<"数组元素和:"<<sum(obj.GetArray(),obj.GetSize())<<endl;;
}
//函数模板的应用
template<class T>
T sum(T data[],int nSize)
{
T sum=0;
for(int i=0;i<nSize;i++)
sum+=data[i];
return sum;
}
函数模板的用法同C++预处理器的用法有一定的类似之处,它们都提供编译代码过程中的文本替换功能,但前者可以对类型进行一定的保护。
使用类模板可以编写通用的、类型安全的类。STL中仍然要用到函数模板和类模板。
实例:
/*************************************************************************
* *
* 编制动态数组的模板类 *
* *
*************************************************************************/
#include<iostream.h>
template<class T>
class MyArray
{
private:
int m_nTotalSize;//数组总长度
int m_nValidSize;//数组有效长度,即当前数组的最后一个元素下标+1
T* m_pData;//数据
public:
MyArray(int nSize=3)//数组默认总长度为3
{
m_pData=new T[nSize];
m_nTotalSize=nSize;
m_nValidSize=0;
}
~MyArray()
{
if(m_pData!=NULL)//判断是否为空,如果已经释放,则不再释放了。
//避免对同一内存释放两次
{
delete []m_pData;
m_pData=NULL;
}
}
//想m_pData添加数据
void Add(T value)
{
if(m_nValidSize<m_nTotalSize)//如果有效长度小于总长度
{
m_pData[m_nValidSize]=value;
m_nValidSize++;
}
else//有效长度大于总长度,此时要进行数组扩展
{
T* tmpData=new T[m_nTotalSize];//原始数据备份
for(int i=0;i<m_nTotalSize;i++)
{
tmpData[i]=m_pData[i];
}
delete []m_pData;//释放原始数据内存空间
m_nTotalSize=m_nTotalSize*2;//原始数据空间重新分配,空间扩大1倍
m_pData=new T[m_nTotalSize];
//传回备份数据
for(i=0;i<m_nValidSize;i++)
{
m_pData[i]=tmpData[i];
}
delete []tmpData;//释放备份数据内存空间
m_pData[m_nValidSize]=value;
m_nValidSize++;
}
}
//返回数组的有效长度
int GetSize()const
{
return m_nValidSize;
}
//返回某一位置元素
T Get(int pos)const
{
return m_pData[pos];
}
//返回数组
T* GetArray()const
{
return m_pData;
}
};
template<class T>
T sum(T data[],int nSize);
void main()
{
MyArray<int> obj;
obj.Add(1);
obj.Add(2);
obj.Add(3);
obj.Add(4);
for(int i=0;i<obj.GetSize();i++)
{
cout<<obj.Get(i)<<endl;
}
cout<<"数组元素和:"<<sum(obj.GetArray(),obj.GetSize())<<endl;;
}
//函数模板的应用
template<class T>
T sum(T data[],int nSize)
{
T sum=0;
for(int i=0;i<nSize;i++)
sum+=data[i];
return sum;
}
相关文章推荐
- STL学习小记--与C++模板相关的几个特性
- 【C++ STL学习之四】Map类模板
- C++ Standard Stl -- SGI STL源码学习笔记(03) STL中的模板编译期检查与偏特化编译期检查
- STL学习小记--与C++模板相关的几个特性
- C++ 学习练手 - 双向链表的模板实现
- 短时间让大家对C++ STL有所学习
- C/C++学习----第五章 模板
- C++学习摘要之八:模板
- C++ STL(标准模板库) 学习资源列表
- [C++再学习系列] STL容器删除操作总结
- C++ 学习练手 - 数组型栈的模板实现
- 用示例学习C++的模板
- C++ STL 学习笔记
- [C++再学习系列] 函数模板和类模板
- [C++再学习系列] STL容器的存储结构
- c++高级应用(模板)(STL)(模板嵌套)
- C/C++学习----第五章 模板
- C++ STL(标准模板库) 学习资源列表
- C++精华(STL)学习笔记之迭代器
- C++之父Bjarne谈C++中的STL模板