大杂院-------STL中的泛型思想与迭代器家族

         十一过完了..课一下子变的多了..每天都安排的满满的..~~也没时间写博文了.今天还算好,只有两节课,...

 

----------------------------------------------------------------------------------------------------------------------------------------------------

 

         真的是很佩服Alex那帮人.泛型思想,它的出现,使得C++不只是一门面向对象语言,,更是一门生命力如些之强的语言..它让无数的人看到了,C++的闪光点...

         佩服Alex,不只是它在泛型思想上做出了如此巨大的贡献,,更加重要的是.他们那重孜孜不倦的工作太度,与研究,创新的精神...

         任何科学技术的发展,都需要这样的人...

 

----------------------------------------------------------------------------------------------------------------------------------------------------

1>什么是泛型

 

         其实就是很通用,,尽可能少的依赖于特定的条件.

         泛型数据结构,指可以处理的数据类型不是唯一固定的,

         泛型算法,对它所操作的数据结构尽可能少的依赖,

 

2>迭代器的产生背景

 

         当C++作为一个如此有生命力的语言出现时,,它的,对C语言兼容性,面向对象思想,吸引了,很多优秀的工程师为之奋斗,它们,经过很长时间的运用,探索,发现,每次都要写很多没有必要的东西(之前写过无数次的),在这方面所花的时间,占了他们工作的大时间,而且占的会越来越多.多么可怕的事情..那么,对于一种算法,我能不能只把它的算法思想表示出来..而不论我想把它用在什么数据结构上,它都能正确的工作呢.??

 

这样就慢慢出现了,模板和泛型算法.

 

3>一个例子

 

         现在,用一个最简单的例子,来描述这个过程.

 

这是一个最简的查找算法:

 

int lookup(int * array, int n, int value)

{

        for(int i=0;i<n;i++)

        {

                 if(*(p++) == value)

                           return i;

        }

        return -1;

}

 

这里有几个问题:

        1),我的算法只针对 int 型的序列有效(算法和数据结构的依赖关系);

        2),我的算法引用数据结构,这时我的数据结构安全性很低,(没有对外界操作进行限制)

        3),我的 array 结构,和n有很大的依赖关系(n为array中结点的个数);(参数之间有依赖关系)

        4),我的 srray 结构必需是顺序存放的(算法本身与数据结构的实现形式有依赖关系)

        5),我的算法内部用了i作为位置的标识,(算法相当然的给数据结构加了操作)

        6),我的算法 没找到返回是-1,(这又是按自己的意愿,加了一层,算法和数据结构之间的依赖)

                         .

                         .

                         .

 

----------------------------------------------------------------------------------------------------------------------------------------------------

 

4>STL中的解决方法

 

        1),首先,针对上面的2,3,4问题(不是太绝对),我们可是用类对其进行封装,

 

        2),对于1,5,6问题,我们可以用模板(template)实现,

 

template<class P,class T>

T lookup(P array,T value)

{

        //...

}

这里,用了模板,然后,把类P和T应有的行为封装起来,(比如,移动,++,--这样的操作)

很显然,T是一个用户类型,P是装T类型的序列,

 

其实,我们这样做已经很好了.只要一个类满足一些条件(封装了lookup中用到的方法),就能使用lookup进行查找了.

 

可是,又出现了新的问题,也是开始提到的,P是装的是T类型的序列,但是我用什么去操作P对象呢,(总不能用T类型吧,这样,那P的操作不也依赖于T类型了吗)

 

5>,新问题的解决方法--------迭代器

 

template<class P ,class T>

P::iterator & lookup(P array, T array)

{

      //...

}

 

这样,P容器类的各种操作都是P::iterator这个叫做迭代器的家伙实现的(插入,取出,移动等等..)

 

6>,STL中的迭代器

 

        //约定:p,q为迭代器

       1),输入迭代器

 

   提供的操作:

         取元素 *p ,移动位置 p++(++p) ,判断位置 p==q(p!=q),

 

       2),输出迭代器

 

   提供的操作:

         *p可以对对应的元素进行修改(明显,输入应该禁止掉修改)

 

       3),前向迭代器

 

   提供的操作:

         输入和输出迭代器的结合

 

       4),双向迭代器

 

    提供的操作:

         在前向的基础上,加了可以向前移动的能力(p--和--p)

 

       5),随机存取迭代器

 

    提供的操作:

          很明显,从名子可是看得出来,这个是允许随即访问的,

          在双向迭代器的基础上,加上了.+,-,+=,-=和[]操作.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值