STL源码剖析 迭代器iterator的概念 和 traits编程技法

  • iterator模式定义如下:提供一种方法,使之能够依序巡访某个 聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式.
  • STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以一帖胶着剂将它们撮合在一起。容器和算法的泛型化,从技术角度来看并不困难,C ++的class templates和 function templates可分别达成目标。如何设计出两者之间的良好胶着剂,才是大难题。

 迭代器 (iterator ) 是一种 smart pointer

  • 迭代器是一种行为类似指针的对象,而指针的各种行为中最常见也最重要的便是内容提领〈dereference)和成员访问(member access) , 因此,迭代器最重要的 编程工作就是对 operator* 和 operator-> 进行重载(overloading) 工作。关于 这一点,C++标准程序库有一个auto_ptr可供我们参考任何一本详尽的C++ 语法书籍都应该谈到auto_ptr 这是一个用来包装原生指 针 (native pointer)的对象,声名狼藉的内存漏洞(memory leak)问题可藉此获得解决. auto_ptr用法如下,和原生指针一模一样:

  • 函数第一行的意思是,以算式new动态配置一个初值为"jjhou” 的 string 对象,并将所得结果(一个原生指针)作为aUtoj>tr<Strin g > 对象的初值。注意, auto_ptr角括号内放的是“原生指针所指对象”的型别,而不是原生指针的型别. 

迭代器相 应 型 别 ( associated types )

  •  我们以func ()为对外接口,却把实际操作全部置于func_impl()之中.由于 func_impl ()是一个function template,—旦被调用,编译器会自动进行template参数推导。于是导出型别T,顺利解决了问题。
  • 迭代器相应型别(associatedtypes)不 只 是 “迭代器所指对象的型别”〜种而 已。根据经验,最常用的相应型别有五种,然而并非任何情况下任何一种都可利用上述的template参数推导机制来取得.我们需要更全面的解法。

Traits编程技法— STL源代码门钥

  • 迭代器所指对象的型别,称为该迭代器的value iy p e .上述的参数型别推导 技巧虽然可用于value ty p e ,却非全面可用:万一 value typ e 必须用于函数的传 回值,就束手无策了,毕竟函数的*"template参数推导机制”推而导之的只是参数,无法推导函数的回返值型别。
  • 我们需要其它方法。声明内嵌型别似乎是个好主意,像这样:

  • 注 意 ,func ( ) 的回返型别必须加上关键词typename , 因 为 T 是一个 template参数,在它被编译器具现化之前,编译器对T 一无所悉,换句话说,编 译器此时并不知道MyIter<T>: : value_type代表的是一个型别或是一个member function或是一个data m e m b e r . 关 键 词 typename的用意在于告诉编译器这是一个型别,如此才能顺利通过编译。

  •  大致的意义是:如 果 class template拥有一个以上的 template参数,我们可以针对其中某个(或数个,但非全部)template参数进行特化工作。换句话说,我们可以在泛化设计中提供一个特化版本(也就是将泛化版本中的某些template参数赋予明确的指定)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值