iterator小结2

zhouzicn 2002-03-28 04:38:11
3. Iterators的概念(concept)
我们知道iterators分成5类(Input iterators、Output iterators、Forward iterators、Bidirectional iterators、Random access iterators),那么是怎样形成的呢?这就需要从概念说起了。
3.1. 概念(concept)、模型(model)和细化(refinement)
概念C是指描述某种抽象类型的一组需求(requirements),例如,上面定义myiter之前我们提出的要求(first != last;*first != value;++first)就可以作为一个概念看待。再STL中的概念很多,常见的基本概念有:assignable、default constructible、equality comparable、lessthan comparable、range等
类型T能够满足概念C所有的需求,则称T为C的一个模型(model)。
概念C1的需求req1包含概念C2的需求req2,则C1对C2作了细化。例如:五中iterators中概念Bidirectional iterators是对Forward iterators的细化。
关于类的继承,我们知道类A继承了类B是指类A在类B的成员变量和成员函数的基础上定义新的成员变量和成员函数。细化和继承都是在原有的基础上作扩展,因此看起来很相似,但两者有本质的区别:
1) 就继承而严,如果类A继承了类B,而a是A的对象,b是B的对象,那么我们可以说a也是B的对象,却不能说b也是A的对象。
2) 相反,如果C1细化了C2,而T1是C1的模型,T2是C2的模型,那么不可以说T1是C2的模型,却能说T2是C1的模型。例如:概念Bidirectional iterators细化了概念Forward iterators,可使用满足后者模型之处,都可使用前者产生的模型,反之不然。
对于概念的理解可以从三个角度:(1)描述某种抽象类型的一组需求;(2)某类抽象类型的组合;(3)一组正确的代码。第三点比较难理解,但很有用,因为概念的发现不是通过列举需求,而是通过对算法的定义及形式化模板参数的研究取得的。(对如何通过Tecton语言的描述产生新概念,还需要进一步学习)。
3.2. Input Iterators
Input iterators的概念是研究find算法的过程中总结出来的。相对于自己定义的myiter,Input Iterators的需求更完备和具体:
1) 能进行构造或缺省构造
2) 能被复制或赋值
3) 能进行相等性比较
4) 能进行逐步前向移动(++)
5) 能进行读取值(x=*p,但不能改写)
其中,1、2点是所有iterators都要具备的,3、4、5是Input Iterators所需要的。
3.3. Output Iterators
Output iterators的概念可以相对copy算法理解。copy算法:
Template <class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
for( ; first != last; ++result, ++first) *result = * first;
return result;
}
result就是OutputIterators的一个模型,它的要求包括:++result、*result = * first。这样,Output Iterator的需求包括:
1) 能进行构造或缺省构造
2) 能被复制或赋值
3) 能进行逐步前向移动(++)
4) 能进行写入值(*p=x,但不能读出)
3.4. Forward Iterators
使用Input Iterators 和Output Iterators可以满足算法和容器的要求,但还是有一些算法需要同时具备两者的功能,例如replace算法就是一例。Forward iterators就是为满足这些需求而定义的。同样先看看replace算法(用新值代替旧值)的需求:
template <class ForwardIterator, class T>
void replace ( ForwardIterator first, ForwardIterator last, const T&old_value, const T& new_value)
{
for( ; first != last; ++fist)
if (*first == old_value) *first = new_value;
}
first、last都是Forward Iterators的模型,它们的要求包括:first != last、++fist、*first == old_value、*first = new_value。这样,Forward Iterators的需求包括:
1) 能进行构造或缺省构造
2) 能被复制或赋值
3) 能进行相等性比较
4) 能进行逐步前向移动(++)
5) 能进行读取、写入值(x=*p,且可*p=x)
3.5. Bidirectional Iterators
Bidirectional Iterators的概念是在Forward iterators的基础上加入逐步后向移动(--)这个要求,从而满足两个方向的运动。
3.6. Random Access Iterators
Random Access Iterators的条件(需求)更多,它覆盖前四种iterators的所有条件,并且要满足下面条件(对数组的操作要求):
1) Operator + (int) //随机访问iterators可以随机移动,而不是逐步的。
2) Operator += (int)
3) Operator - (int)
4) Operator -= (int)
5) Operator - (random access iterator)
6) Operator [] (int) //随机取某的位置容器的值
7) Operator < (random access iterator) //随机访问iterators之间的比较
8) Operator > (random access iterator)
9) Operator <= (random access iterator)
10) Operator >= (random access iterator)
...全文
92 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
winmain 2002-03-29
  • 打赏
  • 举报
回复
这些我为什么觉的这么眼熟?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧