《C++标准程序库》读书笔记(一)

来源:互联网 发布:中国最大的程序员社区 编辑:程序博客网 时间:2024/05/17 20:28

第五章.STL概述:

1.STL的基本思想就是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义,迭代器在其中充当粘合剂,使任何算法都可以和任何容器交互运作。

2.STL的一个根本的特性是所有组件都可以针对任意型别运作。

3.标准的容器只有几种,分为序列式容器和关联式容器:

         序列式容器:vector,deques,list

         关联式容器:set,mutiset,map,mutimap

其他的一些比如stack,queue则是容器配接器,是根据上面的容器进行相关修改而来的。

4.关于迭代器的begin(),end():是一个半开区间,包含第一个元素,但是不包含最后一个元素。使用半开区间的优点在于:第一只要迭代器到达end,就说明到头了,此处不进行操作。第二,不必对空区间进行特殊操作,因为空区间的begin()等于end()。

5.关于前置递增和后置递增:能使用前置递增就使用前置递增,后置递增会产生一个临时对象,效率较低。

6.STL容器为了性能,并没有进行异常处理。

 

 

第六章.STL容器

1.STL容器的共通能力:

         a.都是value语义而非reference语义:STL容器中对象保存的是value,元素放入容器中时进行的是拷贝操作,进而容器中存储的都是对象的副本。如果要放入容器的对象不能进行拷贝,那么就只能存入指针。

         b.总体而言,元素形成一个次序。容器可以迭代遍历所有元素,这也是STL最基本的功能。

         c.一般而言,各项操作并非绝对安全,STL不会自己抛出异常。

 

2.STL容器的共通操作:

         a.初始化:STL容器都提供了default构造函数,copy构造函数以及一个析构函数。当然还可以通过一个区间的元素作为初值初始化容器。

         b.size,empty,max_size,==(等一系列比较容器的符号),swap(交换容器的数据),begin(返回一个迭代器,指向第一个元素),end(返回一个迭代器指向最后一个元素的下一个位置),rbegin(返回一个逆向迭代器,指向逆向的第一个位置),rend(返回一个逆向迭代器,指向逆向迭代器的最后一个元素的下一个位置),inser(pos,elem)(在pos处插入elem的副本),erase(beg,end)删除区间内的元素,clear(清除容器内的元素)

 

 

 

 

3.vector:

a)      vector内部为动态数组,支持随机存取。在尾部添加或删除元素性能很好,但是在中间添加或删除涉及后面全部元素的移动,而且是value的,性能不好。

         b)      vector大小相关的函数:size当前元素个数,max_size最大元素个数,capacity容量-这个涉及到动态扩容的问题,当size大于capacity时,大小不够就会扩容,此时所有的元素的指针引用迭代器都会失效,而且会比较耗时。所有如果性能要求较高,可以使用reserve预先设置容量。

         c)      构造有很多种构造方式,默认为空的vector,可以设置大小,可以根据两个迭代器的元素进行初始化。赋值也是类似。

         d)      元素存取,vector支持随机存取,我们可以通过[]即类似数组下标的方式存取,也可以通过at(index)存取。front,back可以分别获得vector的最开始和最末尾的元素。除了at会检测边界,抛出异常,其他均不会。使用之前需要进行判断,比如vector是否为空。

 

4.deque:

         a)      和vector非常类似,不过在双向都提供安插和删除。内部为两个独立的数组区块。单独存取会有间接过程,可能没有vector快。区块不再使用时会被释放。在中间安插内容会和vector一样,导致重新移动,性能不好。可以随机存取。

         b)      deque提供头部的安插和排除函数。但是不提供vector一样的capacity和reserve函数。

         c)      其余大部分操作均与vector类似。

 

5.list:

         a)      list内部使用一个双向链表,与vector和deque完全不同。因而list不支持随机存取,但是在任何位置安插或者删除元素都非常快。安插删除操作并不会导致指针等失效。

         b)      List并未提供capacity和reserve函数,因为没有必要。提供了一些额外的函数,比通用STL函数有更好的性能。

         c)      关于元素访问只有front和back,而且没有异常处理,我们需要自己判断是否非空。List提供了remove(value)函数,可以移除所有值为value的元素。还有remove_if函数,可以根据传入的函数定义移除元素的规则。

         d)      提供了unique函数,去除重复,提供了splice函数,将元素转移(可以在不同容器间转移),sort函数用于排序,merge函数用于合并,reverse将元素反序。

         e)      list对于异常提供了较好的保护,大多数操作都是如果不成功就什么都不发生。

 

 

6.set和multiset:

         Set和multiset的区别在于multiset允许元素重复而set不允许元素重复。

a)      Set内部通常是平衡二叉树结构,或者红黑树。元素插入后自动排序,对于搜索有很好的性能。但是有些地方和其他容器有所不同。不能更改元素值,如果要更改就必须将原来的值删除,再重新插入。

b)      Set提供了更好的搜寻相关的函数,性能更高。Count返回elem个数,find用于查找第一个值为elem的元素。

c)      插入仍然用insert,但是删除使用erase。Set和MultiSet的insert返回值可能不一样,set返回一个pair,first为新元素位置(不成功时为原来此值的位置),second为是否成功。Multiset返回一个迭代器。

7.map和multimap:

a)      Map和Set类似。Set可以看做是一种特殊的Map。Map是以key/value键值对作为元素的。内部也是平衡二叉树。

b)      元素的安插和删除都和set类似。Insert和erase。对于修改,仍然是将原来的值删除,再重新插入。查找用find函数。

c)      关于pair,有make_pair(elem1,elem2),或者通过pair的构造函数初始化。

d) 关于迭代器的删除,直接调用erase的话,会导致迭代器失效,不再指向原来的副本。但是此时如果进行pos++的操作,仍然可以使迭代器指向下一个位置。

e)      map可以作为关联数组,通过[]进行操作。

0 0
原创粉丝点击