c++ primer plus 第16章string 类和标准模板库, 泛型编程----为何使用迭代器
c++ primer plus 第16章string 类和标准模板库, 泛型编程----为何使用迭代器
泛型编程16.4
有了一些使用 STL的经验后,来看一看底层理念。STL是一种泛型编程(generic programming)。面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。它们之间的共同点是抽象和创建可重用代码,但它们的理念绝然不同。
泛型编程旨在编写独立于数据类型的代码。在 C++中,完成通用程序的工具是模板。当然,模板使得能够按泛型定义函数或类,而 STL通过通用算法更进了一步。模板让这一切成为可能,但必须对元素进行仔细地设计。为解模板和设计是如何协同工作的,来看一看需要迭代器的原因。
16.4.1 为何使用迭代器
理解迭代器是理解 STL的关键所在。模板使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型。因此,它们都是STL通用方法的重要组成部分。
为了解为何需要迭代器,我们来看如何为两种不同数据表示实现 find函数,然后来看如何推广这种方法。首先看一个在 double数组中搜索特定值的函数,可以这样编写该函数:
double *find_ar(double*ar,int n,const double & val)
{
for (int i=0;i < n; i++)
if (ar[i]== val)
return &ar[i];
return 0;//or,in C++1l,return nullptr;
}
如果函数在数组中找到这样的值,则返回该值在数组中的地址,否则返回一个空指针。该函数使用下标来遍历数组。可以用模板将这种算法推广到包含==运算符的、任意类型的数组。尽管如此,这种算法仍然与一种特定的数据结构(数组)关联在一起。
下面来看搜索另一种数据结构–链表的情况(第12章使用链表实现了Queue类)。链表由链接在一起的 Node 结构组成:
struct Node
{
double item;
Node *p_next;
}
假设有一个指向链表第一个节点的指针,每个节点的pnext指针都指向下一个节点,链表最后一个节点的pnext指针被设置为0,则可以这样编写findll()函数:
Node* find 1l(Node *head,const double & val)
{
Node *start;
for(start