读书笔记——Accelerated C++ Chapter 8

一、一些定义

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.顺序写迭代器中所谓的“一次写入”是对使用迭代器的程序,而不是对迭代器本身。

原文地址:https://www.cnblogs.com/wenhuozhujiangcha/p/3448367.html