懒人手记(无整理,无排版,只为备份)

来源:互联网 发布:刺客信条5优化 编辑:程序博客网 时间:2024/04/30 06:12

    
    很多相关stl都是从容器入手,对于那些完全不知道stl为何物的初学者,(比如说我)似乎对理解stl会容易些,毕竟相对于很抽象的迭代器和算法,容器和我们已经掌握的知识(数组,链表等)有一定的相似性,或者说就是在实现上的泛型化,在功能上封装了很多行为、及定义了相关迭代器。
    但是当对其有了一定的了解后,就会发现要想深入理解、正确掌握最终达到熟练运用,我个人觉得,要讲迭代器算法相结合的方式为主线,把容器当作其中一个辅助元素(可操作的对象,被作用者来理解,毕竟容器是死的),这样stl才能真正显现作为一个可用行极强的工具的生动之处。一句话:stl是是一个泛型的程序库,核心是利用算法来管理数据。
    总之,stl赋予c++新的抽象层次,我们可以完全把动态数组,链表,二叉树抛开,也不用再操心不同的搜寻算法了。

    当然,以迭代器和算法相结合的方式来阐述下这阵子对stl的理解,并不是完全置容器于不顾,毕竟我们要施力于它。所以要简要的用几句话小结下容器。
    容器:可以放任何类型的集合。
    迭代器:从指针上抽象出来,最容易想到的是它的遍历作用;
    算法:处理群集内的元素的。(我们从中可以看出容器确实是作用的对象);举例说明非stl实现。
    笔记说明了些个人对迭代器的理解:两次分离;
    stl的基本观念就是将数据与操作分离,数据由容器类别加以管理,操作则由可定制的算法定义之,迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互运作,更重要的是接口统一。

    迭代器:迭代器是一种“能够遍历容器内所有元素”的对象,它可以透过与一般指针一致的接口来完成自己的工作;迭代器奉行一个纯抽象的概念,任何东西,只要行为类似迭代器,就是一种迭代器。按比较严密的说法,分为输入,输出、、、但是这不易理解,我更喜欢把它在算法中所起的作用分类我们按实现中需求应用很直观的把它分为:随即(正向,逆向)、安插、流相关。
  
    举例随机:itercat.cpp (正向基本指针功能);reviter1.cpp(正向和逆向,且迭代器和算法(for_each())搭配的最好且比较简单的实例):此处有两处比较隐晦的知识点,很容易犯错或者令人迷惑,应该算是要点了。1.for_each()的 半开半闭特性(先看itercat.cpp中端点的.begin()->.end(),很显然.end()是标志,是没有值的,那么当只是区间呢?看reviter3.cpp##部分;2..rend()->rbegin()两部运算,((((步骤:1.随机类指针方式2.引入for_each()可以方便遍历容器3.简要介绍逆向指针,结合for_each()逆向遍历4.两个要点引入(a.for_each()的半开半闭b.逆向迭代器的内部操作:自减))))

    安插型:我们说过任何行为类似迭代器都是一种迭代器,安插型就是一种比较抽象的迭代器了
它 back_insert_iterator可以调用容器的push_back()生成函数back_inserter(cont);两种应用方式:1.一般指针接口,*pos直观上是一样的,内部实现不一样,是先调用。。。2.显式的方法:直接用插入式函数(我们看到这种显式应用提醒我们,用安插式迭代器一定要指定具体容器实例,而不是像随机迭代器那样只需指出所需类型就可以,以为插入是要对);;;copy()(((1.两个容器间,这是一个危险的行为,因为第二个容器只有起始点。然后,由于算法执行的是覆盖动作而不是安插动作,所有目标容器必须要有元素来被覆写,否则就会像例子一样导致未定义行为。解决办法是以开始就给目标容器一个正确的大小,要不就显式的改变其大小:如coll2.rezise(coll1.size());))) (((步骤:1.引入安插概念和两种调用方式(书上图及例子backins.cpp)2.引入copy()算法分析:在普通两容器间应用时易范的错误 例子copy1.cpp3.引入插入迭代器使问题解决,即安插迭代器和copy()算法的完美结合。例子inserter.cpp..
    流相关:输入流和输出流。输入:问题:除了非法输入外怎么样终止程序;当是char型只能中止进程来退出,但是此程序不在可用了;等输入是文件时end_of_stream如何应用;输出:指出应用那个何种流即可。此步骤重点:1输出流也有指针统一接口2阐述流接口(控制台和文件)统一