在C++中,泛型编程时一个重要的特性。与面向对象不同的是,泛型编程关注的是算法。泛型编程旨在编写独立于数据类型的代码。在C++中,完成通用程序的工具是模版。当然,模版使得能够按泛型定义函数或类,而STL通过通用算法更近了一步。迭代器就是为了解决模版和设计协同工作的问题。
首先看一个在int数组中搜索特定值的函数。
int * find_array(int * array, int n, const int value){
for(int i=0;i<n;i++)
if(array[i] == value) return &array[i];
return 0;
}
这是一个在数组中搜索特定值的函数。这个函数的局限性在于与一种特定数据结构(数组)关联起来。
再看一个在链表中搜索的情况。
struct node{
int item;
node * next;
};
node *find_node(node * head, const int value){
node *start;
for(start = head; start !=0; start = start->next)
if(start->item == val)return start;
return 0;
}
同样的,这种算法与链表关联在一起。
泛型编程旨在用同一个find方法解决所有的容器数据类型。模版提供了存储在容器中的数据类型的通用表示,因此还需要便利容器的值,迭代器正式这样的通用表示。
首先迭代器需要满足以下条件
1.需要对*p进行定义
2.需要对赋值运算符进行定义
3.需要对比较运算符进行定义
4.需要能便利容器中元素
这样可以重写这个函数
typedef int * iterator;
iterator find(iterator begin, iterator end, const int value){
for(iterator i=begin; i!=end; i++)
if(*i == val) return i;
return end;
}
实际上,STL遵循了这种方法。首先每个容器类定义了相应的迭代器类型。其次,每个迭代器都有一种超尾标记当迭代器超过一个最后一个元素时,这个值将被赋给迭代器。每个容器都有end和begin方法,分别指向第一个元素和超尾元素。
实际上,作为一种编程风格,最好避免直接使用迭代器,而尽量用STL函数处理。
后面几篇简书准备再等深入的写迭代器