读书摘要─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。










 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值