C++学习笔记(八)

         今天下午又要考C++了。上周的C语言考得不是很好,这也在自己的预料中。这个C++估计也不能上80了。哎,不过还是把STL总结一下吧。 

容器-迭代器-算法三者关系图

我的理解:

容器——一种容纳数据的结构;

迭代器——一种具有指针操作特征的类;通常定义为容器类的友元成员;

算法——根据容器的特点,对迭代器按照一定的逻辑组成的满足一定运算功能的“函数”;

        Vector是STL中最接近原始数组的容器,它提供的迭代器是Random Access iterator,其内部实现也是使用连续内存。它也提供了下标操作符的重载,使用的时候完全可以当成一个数组,只不过更安全。它的随机访问速度非常快(类似于数组下标访问),但是和数组一样,插入和删除操作将会代价高昂。如果插入时,内部原来分配的内存块不够,则vector会自动重新分配一块更大的,然后将原来的数据块拷贝过去。为了部分解决这种频繁的分配动作带来的性能问题STL定义了一个reserve方法,允许用户一次分配一块足够大的内存备用。

         Vector的类型定义是: template <class Type, class Allocator<=allocator<Type> >class vector

        它有两个参数,其中第一个是它内部容纳的对象的类型,第二个是一个分配器。STL的所有容器都允许用户自己定义自己的内存分配策略。如果用户认为STL的默认内存分配策略效率不够高或不能满足自己的需要,则可以自己设计一个内存分配器,将它传递给容器的分配器参数,容器将使用用户的分配器来执行内存分配。一般情况下,我们不需要自己指定分配器,所以该参数带有一个默认值allocator<Type> ,这个分配器就是STL的默认分配器。

         list是STL中的双向链表,它提供的迭代器是Bidirectional Iterator。从双向迭代器的性质我们可以知道,list可以支持快速的前后移动,但不支持随机访问。它的插入速度和删除速度很快。由于它的内存不是连续的,所以也没有容量和内存保留的概念。一般的STL实现时还会附带实现一个slist,它是单向链表,我们前面的例子就是一个单向链表。单向链表提供的迭代器是Input Iterator或Output Iterator, 它比list少耗内存,单向访问的速度很快,但它的插入或删除速度都很慢。实际上很多STL的实现并没有按照slist的真实数据结构来设计,而是直接将list加一个slist的适配器来实现,毕竟每一个节点只是多了一个指针的内存而已。

        dequeue 是STL中的双端队列,它是一种两头都可以快速插入删除,中间可以快速随机访问的数据结构,提供的迭代器是Random Access Iterator。它的实现一般是一个二维的动态数组,它的插入/删除速度当然比vector快,而比list慢,随机访问速度比vector也要慢(至少需要两次寻址)。一般的STL实现中还有一个queue, 虽然queue和dequeue名字看前来很近似,但由于queue只要求在头尾进行操作,,所以一般queue都是用插入删除极为快速的list上加queue适配器来实现的。

        以上几种称作sequence型容器,一个共同的特点是容器内部容纳的是一组逻辑上为线性关系的单一类型的对象。

        STL中除了线性的sequence型容器外,还有另外一类称为关联型(Associative)容器。

        Set(集合)是一种排序的容器,它要求内部的对象彼此间严格有序,即可以比较次序并且互不相等。它提供的迭代器是Bidirectional Iterator,但由于它的内部对象是排序的,所以其中的对象不能更改。同样,由于其内部是排序的,所以对于查找非常有利,它本身提供了专用的查找算法,而不必使用标准的查找算法。
        Map(映射)是一种按关键字排序的Key-Value对的集合。它要求key是严格有序的。和set一样,它同样有基于key的查找算法。另外,尽管map的key不可以被修改,但key所关联的value却是可以更改的。
        MultiSet(多重集合),和Set的差别在于其内部的对象只要求有序,而非严格有序,即彼此之间可以比较次序,但不要求一定相异。
        MutliMap(多重映射),和Map的差别在于内部的对象的key只要求有序,而非严格有序。
        以上几种容器被称为Associative型容器,这类容器与Sequence型容器相比在查找时具有非常明显的性能优势,但不能提供随机访问能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值