攀登c++高峰
第三篇 第8章
STL 标准模板库
算法+容器+迭代器=STL
算法:algorithm
容器:container
迭代器:iterator
容器适配器:container adaptor
函数对象:functor
STL容器提供了这样的方便,它允许重复利用已有的实现,从而构造自己的特定类型下的数据结构。
STL包含很多计算机科学上的通用算法。
算法通过迭代器来定位和操控容器中的元素。如果没有迭代器,算法和容器就无法相互作用。
STL被组织在多个头文件和名字空间中,药想在程序中更简单使用STL,只需引入相应的头文件,使用对应的名字空间即可
函数模板---函数箱子
虽然算法处理的数据类型不同,但算法本身是相同的,这种情况就可以使用函数模板来简化工作,实现代码的复用。
函数模板的语法格式:
template <typename标识符>
返回值类型 函数名(形参表)
{
//函数体
}
例如:
template<typename T>
T mymax(const T a,const T b)
{
return a>b?a:b;
}
用typename定义的标识符就是函数模板中抽象的数据类型。我们可以使用抽象的数据类型作为模板来代替实际的数据类型。
int _tmain(int argc,_tchar* argv[])
{
int na=2;
int nb=5;
wcout<<na<<"和”<<nb<<“中比较大的是”<<mymax(na,nb)<<endl;//动态生成模板函数int mymax(int,int)
float fa=2.2;
float fb=5.5;
wcout<<fa<<"和"<<fb<<"中比较大的是"<<mymax(fa,fb)<<endl;//东戴生成模板函数float mymax(float,float)
return 0;
}
T->int
T->float
在调用模板函数的时候,编译器会根据调用模板函数的参数类型自动推导出模板函数的类型参数。
显式的调用模板函数的某个特定版本
//显示指明mymax()模板函数的类型参数是string类型,它将调用mymax()函数的string类型版本
string strmax=mymax<string>("chen","jia");
cout<<"较大的字符串是"<<strmax<<endl;
上面的结果是jia是较大的字符串,但我们不是要这个结果
以上这种情况,我们希望mymax()函数返回的是两个字符串中长度较长的字符串,这种情况就需要对模板函数进行特化,实现特定类型的模板函数。
//利用模板特化,实现特定类型的string的模板函数
template<>
string mymax<string>(const string a,const string b)
{
return a.length()>b.length()? a :b;
}
定义好上面这个函数模板之后,开始调用
//情况1:默认情况下,调用mymax<char*>版本
string strmax=mymax("chen","jia");
cout<<"使用普通版本,较大的字符串是"<<strmax<<endl;
//情况2:显示指明模板参数类型,调用模板特化后的mymax<string>版本
//比较字符串的长度,较长的字符串是“chen”
strmax= mymax<string>("chen","jia");
cout<<"使用模板特化版本,较长的字符串是"<<strmax<<endl;
类模板
类模板的语法格式
template <typename 标识符>
class 类名
{
//类的定义
}