zoukankan      html  css  js  c++  java
  • 重温《STL源码剖析》笔记 第三章

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

    第三章:迭代器概念与traits编程技法

      迭代器是一种smart pointer 

      auto_Ptr 是一个用来包装原生指针(native pointer)的对象,声明狼藉的内存泄漏问题可藉此获得解决。

      auto_ptr用法如下,和原生指针一模一样:

    void func() {
        auto_ptr<string> ps(new string("jjhou"));
        cout << *ps << endl;    //输出:jjhou
        cout << ps->size() <<endl;    //输出:5
        //离开前不需delete, auto_ptr会自动释放内存


      函数第一行的意思是,以算式new动态配置一个初值为“jjhou”的string对象,并将所得结果(一个原生指针)

      作为auto_ptr<string>对象的初值
      template partial specialization 

      凡原生指针都没有能力定义自己的相应型别

      iterator_traits(特性萃取机) 通过class template partial specialization的作用,不论是原生指针或

      class-type iterators,都可以让外界方便地取其相应型别。

      最常用到的迭代器相应型别有五种:value type, difference type, pointer type, reference type,

      iterator catagoly

    template<class I>
    struct iterator_traits {
        //需要typename标识的目的是告诉编译器这表示一个类型 
        typedef typename I::iterator_category iterator_category;
        typedef typename I::value_type    value_type;
        typedef typename I::difference_type difference_type;
        typedef typename I::pointer pointer;
        typedef typename I::reference reference;
    };

      根据移动特性与施行操作,迭代器被分为五类:

        Input Iterator:不允许外界改变。只读。

        Output Iterator:唯写(write only)

        Forward Iterator: 允许写入型算法(例如replace())在此种迭代器所形成的区间上进行读写操作。

        Bidirectional Iterator:可双向移动。某些算法需要逆向走访某个迭代器区间

        (例如逆向拷贝某范围内的元素)

        Random Access Iterator: 前四种迭代器都只供应一部分指针算术能力(前三种支持operator++,

        第四种再加上operator--),第五种则涵盖所有

        指针的算术能力,包括p+n,p-n,p1-p2,p1<p2

      这一章的详细内容请看园子里的另外一篇博客: STL源码学习----迭代器及其适配器

  • 相关阅读:
    HDU 2094 产生冠军
    poj 3269 Building A New Barn
    [js
    有感于NC的强大
    was配置oracle RAC集群的数据源
    vb.net 操作xml
    一个用C++写的Json解析与处理库
    配置apache和nginx的tomcat负载均衡
    Remove Duplicates from Sorted Array [Python]
    LoaderManager使用具体解释(一)---没有Loader之前的世界
  • 原文地址:https://www.cnblogs.com/xxiaoye/p/3952288.html
Copyright © 2011-2022 走看看