zoukankan      html  css  js  c++  java
  • 重温《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
  • 相关阅读:
    phpcms基础
    读取数据库有的设置选中状态
    用php 生成 excel 表格
    ajax验证用户名是否存在,手机号是不是匹配
    系统登陆简单的密码验证
    分页显视
    时间选择的三级连动 年,月,日
    session控制登入权限
    jQuery, js 验证两次输了密码的一相同
    正则表达式判断手机号是否11位数字
  • 原文地址:https://www.cnblogs.com/xxiaoye/p/3950771.html
Copyright © 2011-2022 走看看