读书摘要─Generic Programming and STL

    注:这本书的精华在于第一部分的前五章对于STL中各种抽象概念的阐述,后面的内容过于具体了,基本可以当做实现STL的specs了,不是很适合普通用户

一、STL巡礼

    STL提供了一种新的程序设计思维,其中算法和抽象条件居于中心地位。


二、算法和区间

    Concept & Model

    要实现任何线性查找,必须要解决如下问题:

        如何表示要执行查找的目标序列?
        如何表示序列中的(当前)位置?
        如何移动到下一个位置?
        如何得知已经移动到序列尾端?
        如何在返回值中标明查找失败?

    非对称性区间有助于减少”相差一个(off-by-one)“的错误

2.3 迭代器

    Iterator 是算法和数据结构之间的接口。

    Iterator不是一个concept,而是五个不同的concept。


2.3.1 Input Iterator

    只读性── 可以 "x= *p",但不可以 "*p=x"

    必须定义"=="和"!="运算

2.3.2 Output Iterator


    只写性── 可以"*p=x" ,但不可以"x=*p"

    没有必要定义"=="和"!="运算

    为了实现”只写访问“,最简单的做法就是令Output Iterator 的解引用操作返回一个proxy-class;ostream_iterator的不寻常之处在于,其解引用操作返回的proxy-class就是自身

    Input Iterator 和Output Iterator 都只能用于Single-pass算法,这意味着算法的复杂度不能超出线性关系。


2.3.3 Forward Iterator

    Forward Iterator 的重要特质是遵守内置指针的"同一性",或者说符合C的内存模型。


2.3.4 Bidirectional Iterators


    和Forward Iterators 一样,Bidirectional Iterator允许multi-pass算法。

2.3.5 Random Access Iterators

    其真正独特的性质在于支持指针算术运算──能够以固定时间随机访问任意元素。


2.4 Refinement

    如果concept C2 提供concept C1的所有功能,并且附加了额外功能,就称C2是C1的Refinement

    modeling          type 和 concept之间的关系
    refinement       concept之间的关系
    inheritance       type之间的关系

    这三者是事物之间三种不同的关系,无法以其中两种来模拟第三种关系。


三、再论Iterator

3.1 Iterator 的 Associated Types

    3.1.1 value_type

    iterator_traits<>与模板特化:要提供三个版本,一个(主模板)针对T,一个针对T*,还有一个针对 const T *
 
    需要注意的细节:对于 const_iterator, 对应的value_type 应该是 T而不是 const T

    3.1.2 difference_type
 
    3.1.3 refernce和 pointer
 
    如果p是个 forward iterator,其value_type 为T ,那么表达式 *p 不能只是返回类型为T的对象──必须是类型为T的lvalue

    
    C++中,函数通过返回一个引用来返回lvalue──除此之外无二法。


   一般而言,*p对应的类型并不是p的 value_type,而是 p的 reference type

    3.1.4 Iterator Tags──iterator_category

    经典例子:advance()函数── 通过基于type的”函数重载“来模拟”concept 重载“
 

3.2 定义新组件

    STL为用户自定义的迭代器提供了一个可选的基类:iterator<...>
 
    const iterator 和mutable iterator 之间的差异主要是内嵌的reference 和 pointer类型的不同



四、函数对象


    基本的 function object concept有三个

    Generator                  f()
    Unany Function           f(x)
    Binary Function         f(x,y)


    function object VS adaptable function object:区别在于是否提供了内嵌的参数和返回值类型。


五、容器


    类似于Iterator ,Container也不是对应单一concept,而是对应若干个concept;可以根据Container 提供的Iterator的种类,来对Container进行分类:

    Container (提供Input Iterator)
    Forward Container (提供Forward Iterator)
    Reversible Container (提供Bidirectional Iterator)
    Random Access Container(提供Random Access Iterator)

    Sequence 是Forward Container的 Refinement;Sequence 都必须具备 insert()和erase()这两个成员函数

    STL中的三种Sequence,主要差异在于所提供的Iterator种类、Iterator的无效语意以及insert和erase的复杂度

    Sequence的两种Refinement:Back Insertion Sequence 和 Front Insert Sequence


    Associative Container 是Forward Container的 Refinement

    Associative Container 的三种分类法

      Simple Associative Container     VS     Pair Associative Container
      Unique Associative Container     VS     Multiple Associative Container
      Hashed Associative Container    VS     Sorted Associative Container

    这三种分类法具有正交性。


六、基本概念

    Regular Type: 同时满足Assignbale,Default Constructible,Equality Comparable这三个Concept的model

    除非有合理的原因,任何用户自定义类型都应该属于Regular Type。

6.1 Assignable

   如果某个type同时是Assignable和Equality Comparable的model,那么原本和副本应该是相等(equality)的.

   几乎所有内置类型都满足Assignable,不过const T例外


6.2 Default Constructible



6.3 Equality Comparable

    如果某个类型T可以使用operator ==作相等性(equality)比较,并且operator ==表示定价关系(equivalence relation)的话,类型T便满足Equality Comparable


   等价关系是指任何满足“自反性、对称性、传递性”的关系


6.4 Ordering (可序性)


6.4.1 LessThan Comparable

 
    元素之间基于operator < 执行的比较动作,满足"Partial Ordering(偏序)":非自反性、非对称性、传递性


6.4.2 Strict Weakly Comparable


    如果类型T是LessThan Comparable,而operator < 除了满足"partial ordering"条件,还满足更严格的"strict weak ordering"条件,那么T就满足Strict Weakly Comparable。

    strict weak ordering定义为:如果 x<y 和 y<x 均不为真,那么x和y便是等价的

 
    等价关系会将集合分割成等价类的结合,每个等价类中的元素都互相等价。

    total Ordering(全序) 是 一种特殊的stric weak oderging,两个元素x和y,要么x<y,要么y<x,要么 x==y──具体的说,它切分的每个等价类中只含单一数值

    所有C++内置的数值类型都满足Strict Weakly Comparable;特别的,整数的operator < 满足total ordering
 
    满足weak ordering 但不满足 total ordering 的情况很常见──例如忽略大小写的字符串比较


七、迭代器

7.1 tirvial iterator


   只提供解引用而不提供迭代功能的Iterator

7.2 Input Iterator

7.3 Output Iterator

   与其它所有Iterator不同,Output Iterator 不是Trivial Iterator 的Refinement,也不是Equality Comparable的
Refinement

    Output Iterator 不必定义value_type和difference_type。

八、函数对象

    Adaptable function objects之所以被称为"adaptable",是因为它们可用于function object adapter

    在partial ordering定义的基础上(反自反性、反对称性、传递性),再增加等价传递性(transitivity of equivalence),就是strict weak ordering;如果在加上更严格的条件:等价和相等一致,就得到了total ordering。

    没有一个STL算法使用total ordering,因为它的条件过于严格。



十、基本组件

10.4 内存管理

   三个作用于未初始化存储空间的低阶算法

   uninitialized_copy,uninitialized_fill,uninitialized_fill_n

   它们和算法copy,fill,fill_n关系密切,两组间的唯一本质差别在于,前者在未初始化空间上构造新的object,后者对已存在的object赋新值

10.5 临时缓冲区


   get_temporary_buffer & return_temporary_buffer 


十二、 Mutating算法

   共同特质:更改的是iterator所指的值,而非iterator。










 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当读者有一定c/c++基础 推荐的阅读顺序: level 1 从<>开始,短小精悍,可以对c++能进一步了解其特性 以<>作字典和课外读物,因为太厚不可能一口气看完 level 2 然后从<>开始转职,这是圣经,请遵守10诫,要经常看,没事就拿来翻翻 接着是<>,个人认为Herb Sutter主席大人的语言表达能力不及Scott Meyers总是在教育第一线的好 顺下来就是<>和<>,请熟读并牢记各条款 当你读到这里,应该会有一股升级的冲动了 level 3 <>看过后如一缕清风扫去一直以来你对语言的疑惑,你终于能明白compiler到底都背着你做了些什么了,这本书要细细回味,比较难啃,最好反复看几遍,加深印象 看完上一本之后,这本<>会重演一次当年C++他爹在设计整个语言过程中的历程 level 4 <>是stl的字典,要什么都可以查得到 学c++不能不学stl,那么首先是<>,它和圣经一样是你日常行为的规范 <>让你从oo向gp转变 光用不行,我们还有必要了解stl的工作原理,那么<>会解决你所有的困惑 level 5 对于c++无非是oo和gp,想进一步提升oo,<>是一本主席这么多年的经验之谈,是很长esp的 一位stl高手是不能不去了解template的,<>是一本百科全书,足够你看完后对于gp游刃有余 <>是太过聪明的人写给明眼人看的 好书有很多,不能一一列举 以上我的读书经历,供各位参考。接下来的无非就是打怪练级,多听多写多看;boost、stl、loki这些都是利器,斩妖除魔,奉劝各位别再土法练钢了。 at last,无他,唯手熟尔。 忘了一本《thinking in C++》 也是经典系列之一 <>这本圣经的作者Scott Meyesr在给<>序言的时候高度的赞赏了Andrei同志的工作:C++社群对template的理解即将经历一次巨大的变化,我对它所说的任何事情,也许很快就会被认为是陈旧的、肤浅的、甚至是完全错的。 就我所知,template的世界还在变化,速度之快就像我1995年回避写它的时候一样。从发展的速度来看,我可能永远不会写有关template的技术书籍。幸运的是一些人比我勇敢,Andrei就是这样一位先锋。我想你会从此书得到很多收获。我自己就得到了很多——Scott Meyers September2000。 并且,Scott Meyers 在最近的Top5系列文章中,评价C++历史里面最重要5本书中、把Modern C++ Design列入其中,另外四本是它自己的effective c++、以及C++ Programming Language、甚至包括《设计模式》和《C++标准文档》。 显然,Scott Meyers已经作为一个顶尖大师的角度承认了<>的价值。 并且调侃地说,可以把是否使用其中模板方法定义为,现代C++使用者和非现代C++使用者,并且检讨了自己在早期版本Effective对模板的忽视,最后重申在新版本Effective第七章节加入大量对模板程序设计的段落,作为对这次失误的补偿。 并且,在这里要明确的是<>并不是一本泛型编成的书,也不是一本模板手册。其中提出了基于策略的设计方法,有计划和目的的使用了模板、面向对象和设计模式。虽然Andrei本人对模板的研究世界无人能敌,但对其他领域的作为也令人赞叹。 任何做游戏的人都不能忽视OpenAL把,你在开发者的名单里能看到Loki的名字:) 最近很忙,无时间写文章,小奉献一下书籍下载地址。虽然经过验证,但是不感肯定各位一定能下: 中文 http://www.itepub.net/html/ebookcn/2006/0523/40146.html 英文 http://dl.njfiw.gov.cn/books/C/Essential%20C
内容简介   许多程序员可能并不知道,C++不仅是一个面向对象程序语言, 它还适用于泛型编程(generic programming)。这项技术可以大大增强你的能力,协助你写出高效率并可重复运用的软件组件(software components)。   本书由知名的C++专家Matthew H.Austern执笔,引导你进入泛型编程思维模型,并将你带往此一模型的最重要成品:C++ Standard Template Library(STL)。本书揭示STL的奥秘,告诉你STL不仅仅是一组方便运用的容器类(container classes)。对于泛型组件和可交互作用的组件而言,STL是一个具备扩充能力的框架(framework)、《泛型编程与STL》阐述了泛型编程的中心思想:concepts、modeling、refinement,并为你展示这些思想如何导出STL的基础概念:iterators、containers、function objects。循此路线,你可以把STL想像为一个由concepts(而非明确之functions或classes)组成的程序库:、你将学习其正式结构并因此获得其潜在威力所带来的完整优势。本书使你能够:   ●以你自己的“可移植组件”及“可交互作用之泛型组件”扩充STL;   ●产生一些算法,让它们和它们所处理之型别(types)及数据结构彻底划清界线;   ●撰写更精致、更高效、更有效力的代码,可跨平台重复使用。 -------------------------------------------------------------------------------- 媒体推荐 书评 《泛型编程与STL》阐述了泛型编程的中心思想:concepts、modeling、refinement,并为你展示这些思想如何导出STL的基础概念:iterators、containers、function objects。循此路线,你可以把STL想像为一个由来的完整优势…… -------------------------------------------------------------------------------- 编辑推荐 《泛型编程与STL》阐述了泛型编程的中心思想:concepts、modeling、refinement,并为你展示这些思想如何导出STL的基础概念:iterators、containers、function objects。循此路线,你可以把STL想像为一个由来的完整优势…… -------------------------------------------------------------------------------- 目录 译序(侯捷) 前言 第一篇 泛型编程导入 第1章 STL巡礼 1.1 一个简单的例子 ……

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值