本周学习的内容有点多,主要学习了C++中的模板(包括函数模板和类模板)、泛型编程概述和三种容器(vector,deque,list)。
模板
- 模板是C++的一种特性,允许函数或类(对象)通过泛型的形式表现或运行。
- 模板可以使得函数或类在对应不同的型别的时候正常工作,而无需为每一个型别都写一份代码。
例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同版本。
//函数1.
int max(int x,int y);{return(x>y)?x:y ;}
//函数2.
long max( long x,long y){return (x>y)? x:y ;}
//函数3.
double max(double x,double y){return (x>y)? x:y ;}
如果使用模板就能省去一堆冗余代码,
template <typename T> T max(T x, T y){return (x>y)? x:y ;}
C++中有两种类型的模板
- 函数模板:使用泛型参数的函数
- 类模板:使用泛型参数的类
如果我们打算给模板函数(类)的某个特定类型写一个函数,就需要用到模板的特化,实际上,所谓特化,就是代替编译器完成了对指定类型的特化工作,现代的模板库中,大量的使用了这个技巧。
对于偏特化,则只针对模板类型中部分类型进行特化,如
template<T1, T2>
class MyClass;
template<T1, T2>
class MyCalss<int, T2>//偏特化
泛型编程
泛型编程是一种编程方法,这种方法将型别以一种to-be-specified-later的方式给出,等到需要调用时,再以参数方式,通过具体的、特定的型别实例化一个具体的方法或对象。
面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。它们之间的共同点是抽象和创建可重用代码,但它们的理念绝然不同。
泛型编程旨在编写独立于数据类型的代码。在C++中,完成通用程序的工具是模板。模板使得能够按泛型定义函数或类,而STL通过通用算法更进了一步。
迭代器
理解迭代器是理解STL的关键所在。模板使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型。
什么是迭代器?
- 迭代器是指针的泛化
迭代器本身是一个对象,指向另外一个(可以被迭代的)对象
在STL中迭代器是容器于算法之间的接口
- 算法通常以迭代器作为输入参数
容器只要提供一种方式,可以让迭代器访问容器中的元素即可
迭代器的基本思想
- 在STL中,迭代器最重要的思想就是分离算法和容器,使之不需要相互依赖
- 迭代器将算法和容器粘合在一起从而使得一种算法的实现可以运用到多种不同的容器上,如下面例子,find算法接受一对迭代器,分别指向容器的开始位置和最终位置:
template<class _lnlt,class _Ty>
inline _lnlt find(_lnlt _First,_lnlt _Last,const _Ty& _Val{
for(;_First != _Last; ++_First)
if(*_First == _Val)
break;
return _First;
}
find算法对于不同的容器均适用
using namespace std;
vector<int> v(...);
list<int> l(...);
deque<int> d(...);
vector<int>::iterator itv = find(v.begin(),v.end(),elementToFind);
list<int>::iterator itl = find(l.begin(),l.end(),elementToFind);
deque<int>::iterator itd = find(d.begin(),d.end(),elementToFind);