现在的位置: 首页 > 综合 > 正文

c++学习(模板函数以及模板类)

2014年01月13日 ⁄ 综合 ⁄ 共 1927字 ⁄ 字号 评论关闭

1.函数对一个未知类型的参数的使用方法约束了这个参数的类型
2.
标准库对其函数参数的约束条件所采用的组织方式(例如:迭代器的概念)

模板可以让我们为一个行为特性相似的函数族(或者类型族)编写一个单独的定义.
模板函数定义例子:
template <class T>
T median(vector<T> v)
{
   ....;
   typedef typename vector<T>::size_type vec_sz;
   vec_sz size=v.size();
}
T
在函数范围内有效,是一个类型,不是变量.
如果我们有一个诸如vector<T>这样的依赖于一个模板参数的类型,且要使用这个类型的一个本身也是个类型的成员(例如size_type),我们必须在整个名称前加上typename,让系统环境把该名称当作一个类型来处理.
如果定义的模板类型不全部出现在参数列表中,那么调用函数必须用具体的类型来限定函数名.
template<class T>
T zero() {return 0;}
double x=zero<double>();

模板类定义例子:

  Template<class type-parameter[,class type-parameter ]…>

  Class class-name {…};

上述语句生成一个名为class-name的模板类,具体类名取决于给定的类型参数,vec<T>.这些类型参数名称可以在模板内任何地方使用.在类定义范围内,模板类无需加任何限定词就直接使用;在类范围外使用则必须使用类型参数来限定class-name,前面要加上类参数名,:

Template<class T>

vec<T>&  vec<T>::operator=(const vec<T>&) {…}

 

模板类和模板函数在编译时候会被实例化 

5种迭代器类型:
1.
输入迭代器(顺序只读访问):必须支持以下3个操作:1.使用==,!=测试是否相等;2.使用*访问数据;3.使用++递推迭代器到下一个元素;
2.
输出迭代器(顺序只写访问):输出迭代器缺省只写,通常用于将数据从一个位置拷贝到另一个位置.由于输出迭代器无法读取对象,因此你不会在任何搜索和其它算法中使用它.要想读取一个

拷贝的值,必须使用另一个输入迭代器(或它的继承迭代器).一次赋值.
3.
正向迭代器(顺序读写访问):前推迭代器能够读写数据值,并能够向前推进到下一个值,但是没法递减.必须支持:*,++,==,!=以及->
4.
双向迭代器(可逆访问):除了支持正向迭代器的所有操作外,还支持--.
5.
随机访问迭代器:随机访问迭代器能够以任意顺序访问数据,并能用于读写数据(不是constC++指针也是随机访问迭代器).STL的排序和搜索函数使用随机访问迭代器.随机访问迭代器可以

使用关系操作符作比较.

输入流迭代器:istream_iterator
:istream_iterator<int>(cin).此迭代器要求连接cin,读入int类数据.
输出流迭代器:ostream_iterator
为定义输出流迭代器,STL提供了模板类ostream_iterator.这个类的构造函数有两个参数:一个ostream对象和一个string值。因此可以象下面一样简单地创建一个迭代器对象

:ostream_iterator<int>(cout, "/n")

插入迭代器:
插入迭代器用于将值插入到容器中.它们也叫做适配器,因为它们将容器适配或转化为一个迭代器,并用于copy()这样的算法中.例如,一个程序定义了一个链表和一个矢量容器:
list<double> dList;
vector<double> dVector;
通过使用front_inserter迭代器对象,可以只用单个copy()语句就完成将矢量中的对象插入到链表前端的操作:
copy(dVector.begin(), dVector.end(), front_inserter(dList));
三种插入迭代器如下:
 
普通插入器 将对象插入到容器任何对象的前面。
  Front inserters
将对象插入到数据集的前面——例如,链表表头,front_inserter
  Back inserters
将对象插入到集合的尾部——例如,矢量的尾部,导致矢量容器扩展.back_inserter
使用插入迭代器可能导致容器中的其它对象移动位置,因而使得现存的迭代器非法.例如,将一个对象插入到矢量容器将导致其它值移动位置以腾出空间.一般来说,插入到象链表这样的结构中

更为有效,因为它们不会导致其它对象移动.

混合迭代器函数:
 advance()
按指定的数目增减迭代器.
 distance()
返回到达一个迭代器所需(递增)操作的数目.

 

 

 

抱歉!评论已关闭.