一、一些定义
1. 泛型函数
在使用一个函数之前,不知道它的参数或返回类型是什么。这样的函数成为泛型函数。使用和创建泛型函数的能力是C++的一个重要功能。
2.模板函数
实现泛型函数的语言特征被称为模板函数。模板允许为我们为一个行为特性相似的函数族(或类型族)编写一个单独的定义,将族中各个函数(或类型)之间的差别归因于他们的模版参数的类型不同。不同类型的对象仍然可以享有相同的行为特性。
3.五种策略(附加五种迭代器)
3.1 顺序只读访问
对一个序列的元素提供了顺序只读访问操作的迭代器应该支持++(前缀或后缀形式的),==,!=,*,it->member、(*iter).member
如果一个类型提供了以上的所有操作,即为输入迭代器。
我们所见过的每一个容器迭代器都支持所有这些操作,因此他们都是输入迭代器。
Find函数就采用了这种访问方式。
3.2 顺序只写访问
输出迭代器,除了满足输入迭代器的要求之外,还要满足在两个赋值运算之间吵过一次的自加操作,也不能在没有对it进行递增的情况下对it进行多次赋值。
Copy函数就采用了这种访问方式。
3.3 顺序读写访问
Replace函数就采用了这种访问方式,他是在<algorithm>中定义的。
正向迭代器不必满足输出函数迭代器的一次赋值要求,但必须支持以下操作:
*it(对于读和写)
++it,it++(不用支持—it,it--)
it==j和it!=j(在这里,j的类型和it一样)
it->member(作为(*it).Member的一个替代名)
所有标准库容器都满足正向迭代器的要求。
3.4 可逆访问
在一个类型满足了正向迭代器的要求后,并且还支持--(前缀和后缀),就将其称之为双向迭代器。
Reverse函数就采用了这种访问方式,是在<algorithm>中定义的。
所有标准容器类均支持双向迭代器。
3.5 随机访问
随机访问迭代器除了满足双向迭代器的要求之外,还有满足以下条件:
p+n,p-n,n+p
p-q
p[n](与*(p+n)等价)
p<q,p>q,p<=q,p>=q
Sort函数就采用了这种访问方式。向量和字符串迭代器都是随机访问迭代器,链表迭代器只支持双向迭代器。
二、补充
1.在依赖于一个模板参数的类型,希望使用这个类型的一个成员时,可在整个名称前面加上typename。
Typedef typename vector<T>::size_type vec_sz;
2.只要一种类型以某种特定的方式支持特定的操作集时,这个类型才会是一个迭代器。
3.顺序写迭代器中所谓的“一次写入”是对使用迭代器的程序,而不是对迭代器本身。