文章目录:
一、泛型算法
(一)基本概念
STL最大的优点是提供能在各种容器中通用的算法,例如插入、删除、查找、排序等等。STL提供70种左右的标准算法,使用前添加头文件:
# include<algorithm>
一个算法通常可用于多个不同的容器,称为泛型算法(generic algorithm)。注意:
- 泛型算法操作容器对象。
- 泛型算法不直接访问容器的元素,元素的访问和遍历都通过迭代器实现,即面向对象的指针实现,所以迭代器是泛型算法和容器的粘合剂。
- 泛型算法使用模板实现。
泛型算法一般格式:
template<typename T>
函数体中容器类型均为T
泛型算法不依赖于具体的容器,通用的算法更易于扩充。
【typename关键字声明一个类型】
在泛型算法中,函数模板可以使用typename声明模板类型参数,假如现在定义:
template<typename Container>
那么有下面几个概念:
- 从属名称:模板中依赖于模板参数的名称,如Container::iterator依赖于模板参数Container,那么iterator称为从属名称。
- 嵌套从属名称:当从属名称在一个类中。
如果有从属名称时,它依赖于模板参数,在编译时编译器不知道模板参数Container的具体类型,因为此时还没有实例化,只有运行时才知道,所以系统不知道Container的从属名称iterator是一个类型名还是变量名,就会报错,所以需要使用typename声明从属名称的类型,如:
template<typename Container>
void show(Container& con)
{
typename::Container::iterator it=con.begin();//将其声明为类型
}
注意:只有从属名称在使用时需要typename声明类型,其他不可以声明,否则报错。
(二)练习1:打印容器元素
我们在上一篇博文中顺序容器中写的打印函数,只能打印一种容器的不同参数类型。现在实现可以打印任何容器的所有元素。那么:
- 需要用到泛型算法,容器为泛型。
- 使用迭代器作为粘合剂,遍历容器。
那么代码如下:
# include<iostream>
# include<deque>
# include<vector>
# include<list>
//4.泛型算法
//4-1 遍历任何容器
template<typename Container>
void show(Container& con)
{
typename Container::iterator it=con.begin();//iterator为从属名称,所以声明类型,否则编译器不知道
for(;it!=con.end();it++)
{
std::cout<<*it<<" ";
}
std::cout<<std::endl;
}
int main()
{
int a[]={
0,1,2,3,4,5,6,7,8,9,10};
int len=sizeof(a)/sizeof(a[0]);
std::vector<int> vec(a,a+len);//通过迭代器区间构造deque
std::list<int> lis(a,a+len);//通过迭代器区间构造deque
std::deque<int> deq(a,a+len);//通过迭代器区间构造deque
std::cout<<"vector"<<std::endl;
show(vec);
std::cout<<"list"<<std::endl;
show(lis);
std::cout<<"deque"<<std::endl;
show(deq);
}
(三)练习2:查找容器元素
在任意容器中查找一个元素,传入容器的起始,结束位置和元素,找到返回当前位置,找不到返回一个无效位置。
# include<iostream>
# include<deque>
# include<vector>
# include<list>
//4.泛型算法
//4-2查找元素
template <typename Iterator,typename T>
Iterator Find(Iterator first,Iterator last,T& val)
{
for(;first != last;first++)
{
if(*first == val)
{
break;//此时first指向的是有效位置,如果没有找到,那么first会指向容器末尾,无效位置
}
}
return first;
}
int main()
{
int a[]={
0,1,2,3,4,5,6,7,8,9,10};
int len=sizeof(a)/sizeof(a[0]);
std::vector<int> vec(a,a+len)