重温《STL源码剖析》笔记 第一章

                     源码之前,了无秘密。 --侯杰

经典的书,确实每看一遍都能重新收获一遍:

第一章:STL简介

  STL的设计思维:对象的耦合性极低,复用性极高,符合开发封闭原则的程序库。

  STL的价值:1.带给我们一套极具实用价值的零部件,以及一个整合的组织。

        2.带给我们一个高层次的以泛型思维为基础的、系统化的、条理分明的“软件组件分类学”。

  在STL接口之下,任何组件都有最大的独立性,并以所谓迭代器胶合起来,或以配接器互相配接,或以所

  谓仿函数动态选择某种策略。

  STL六大组件:1.容器(containers):各种数据结构,如vector,list,deque,set,map用来存放数据。

         2.算法(algorithms):各种常用算法,如sort,search,copy,erase,etc。从实现的角度看

          STL算法是一种function template

         3.迭代器(iterators):扮演容器与算法之间的胶合剂,是“泛型指针”。一种将operator*,

          operator->,operator++,operator--等予以重载的class template。

          4.仿函数(functors):行为类似函数,可作为算法的某种策略。一种重载了operator()的class

          或class template.一般函数指针可视为狭义的仿函数

          5.配接器(adapters):一种是用来修饰容器、仿函数、迭代器接口的东西。比如:queue

          和stack是一个容器配接器,所有操作由底层deque供应。

          6.配置器:负责空间配置与管理。实现了动态空间配置、空间管理、空间释放的

          class template

  STL六大组件的交互关系:Container通过Allocator取得数据存储空间;Algorithms通过Iterator存取

  Container内容,Functor可以协助Algorithm完成不同的策略变化(比如qsor的最后一个参数),Adapter

  可以修饰或套接Functor。

  图形如下:

  GNU:GNU is Not Unix   是不是递归了,呵呵--

  STL版本,最早的是HP版本,本书介绍的是SGI STL版本

  美妙的源代码:

template<class Interactor, class T>
Interactor find(Interactor first, Interactor last, const T& value) {
    while(first != last && *first != value) {
        ++first;
    }
    return first;
} 

#if defined(_STL_NEED_BOOL)
    typedef int bool;
# define true 1
# define false 0
#endif

  采用前闭后开区间表示法[)。迭代器last所指的是“最后一个元素的下一个位置”

  仿函数代码实现:

 1 template<class T>
 2 struct plus {
 3     T operator() (const T& x, const T& y) const {
 4         return x+y;
 5     }
 6 };
 7 int main() {
 8     //以下产生仿函数对象
 9     plus<int> plusobj;
10     //以下使用仿函数,就像使用一般函数一样
11     cout << plusobj(3,5) << endl;    //8
12     //以下直接产生仿函数的临时对象(第一对小括号),并调用之(第二对括号)
13     cout << plus<int>()(4,6) <<endl;    //10
时间: 2024-09-30 09:56:42

重温《STL源码剖析》笔记 第一章的相关文章

图解STL内存管理的两种边界情况(STL源码剖析补充)

图解STL内存管理的两种边界情况(STL源码剖析补充) 第一种情况就是内存池剩余的小字节空间怎么处理,会不会有内存泄露,答案肯定是不会,但是这个过程是怎么处理的,以下的代码已经简化处理,直接放到VS2010里就可以运行 #include<stdio.h> #include<stdlib.h> static const size_t __ALIGN=8; static const size_t __MAX_BYTES=128; static const size_t __NFREEL

《STL源码剖析》---stl_tree.h阅读笔记

STL中,关联式容器的内部结构是一颗平衡二叉树,以便获得良好的搜索效率.红黑树是平衡二叉树的一种,它不像AVL树那样要求绝对平衡,降低了对旋转的要求,但是其性能并没有下降很多,它的搜索.插入.删除都能以O(nlogn)时间完成.平衡可以在一次或者两次旋转解决,是"性价比"很高的平衡二叉树. RB-tree(red black tree)红黑树是平衡二叉树.它满足一下规则 (1)每个节点不是红色就是黑色. (2)根节点是黑色. (3)如果节点为红色,则其子节点比为黑色. (4)任何一个节

《STL源码剖析》---stl_pair.h阅读笔记

pair是STL中的模板类型,它可以存储两个元素,它也被称作"对组".在map中已经用到了它,pair其实就是一个struct结构,存有两个public的元素,重载了几个运算符,没有什么成员函数,源代码很简单. G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_pair.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy,

《STL源码剖析》---stl_iterator.h阅读笔记

STL设计的中心思想是将容器(container)和算法(algorithm)分开,迭代器是容器(container)和算法(algorithm)之间的桥梁. 迭代器可以如下定义:提供一种方法,能够依序寻访某个容器内的所有元素,而又无需暴露该容器的内部表达方式. 在阅读代码之前,要先了解一个新概念:Traits编程技法 template <class T> struct MyIter { typedef T value_type //内嵌型别声明 T *ptr; MyIter(T *p = 0

通读《STL源码剖析》之后的一点读书笔记

[QQ群: 189191838,对算法和C++感兴趣可以进来] 直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adaptors).算法(algorithms).仿函数(functors)六个部分. 迭代器和泛型编程的思想在这里几乎用到了极致.模板或者泛型编程其实就是算法实现时不指定具体类型,而由调用的时候指定类型,进行特化.在STL中,迭代器保证了ST

《STL源码剖析》---stl_hashtable.h阅读笔记

在前面介绍的RB-tree红黑树中,可以看出红黑树的插入.查找.删除的平均时间复杂度为O(nlogn).但这是基于一个假设:输入数据具有随机性.而哈希表/散列表hash table在插入.删除.查找上具有"平均常数时间复杂度"O(1):且不依赖输入数据的随机性. hash table的实现有线性探测.二次探测.二次散列等实现,SGI的STL是采用开链法(separate chaining)来实现的.大概原理就是在hash table的每一项都是个指针(指向一个链表),叫做bucket.

《STL源码剖析》---stl_alloc.h阅读笔记

这一节是讲空间的配置与释放,但不涉及对象的构造和析构,只是讲解对象构造前空前的申请以及对象析构后空间怎么释放. SGI版本的STL对空间的的申请和释放做了如下考虑: 1.向堆申请空间 2.考虑了多线程.但是这节目的只是讲解空间配置与释放,因此忽略了多线程,集中学习空间的申请和释放. 3.内存不足时的应变措施 4.考虑到了内存碎片的问题.多次申请释放小块内存可能会造成内存碎片. 在C++中,内存的申请和释放是通过operator new函数和operator delete函数,这两个函数相当于C语

《STL源码剖析》---stl_deque.h阅读笔记(2)

看完,<STL源码剖析>---stl_deque.h阅读笔记(1)后,再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation fo

《STL源码剖析》---stl_slist.h阅读笔记

slist(single linked list)是单向链表.它不是STL的标准,它与标准list的主要不同在于迭代器.slist的迭代器是Forward iterator,而list的迭代器是Bidirectional iterator,所以slist有着更多的限制.从另一方面看,slist消耗空间更小,一些操作更快.由于slist是单向的,所以在查找迭代器的前一个结点时比较麻烦,要从头开始找.也就是说slist在头结点插入和删除,在其他位置操作代价都比较大. G++ 2.91.57,cygn

《STL源码剖析》---stl_algobase.h阅读笔记

STL标准中没有区分基本算法或复杂算法,单SGI把常用的一些算法定义在<stl_algobase.h>只中,其他算法定义在<stl_algo.h>中. stl_algobase.h中的算法,比较值得学习的是copy(),它"无所不用其极"的改善效率.copy的目的是复制一段元素到指定区间,复制操作最容易想到赋值操作符=,但是有的赋值操作符=是trivial的,可以直接拷贝.关于赋值操作符=是不是trivial的,可以参考"Memberwise copy