(一)STL体系结构基础介绍

 

一、STL六大部件

  容器(Containers):存放元素,内存由分配器搞定

  分配器(Allocator):支持容器的内存分配

  算法:操作容器元素的函数。与OO不同(面向对象将元素与函数放到一个类里),GP(模板编程)将数据放入容器,操作方法放入算法中。

  迭代器(Iterator): 算法和容器之间的桥梁,通过迭代器,算法才能去操作容器中的元素。迭代器就是泛化的指针。

  适配器(Adapters):对其他组件进行转换。

  仿函数(Functors):自定义类的相关操作(比如自定义类A,计算其两个实例的相加、相减等,即操作符重载)。

二、一个例子使用六大部件

  通常allocator那部分不用写。

        

三、容器遍历

  前闭后开区间

  

  使用auto,for遍历

  

  auto的其他用法

   

 

四、容器结构与分析

  1、顺序容器

  Array:固定大小,连续空间存放

  Vector: 当容量不够时,allocator在背后重新分配

  Deque: 双端队列

  List: 双向链表

  ForwardList:单向链表

  

  2、关联容器(包括Unordered_Containers)

  

  关联容器的查找很快

  Map/Set:一般用红黑树实现(左右高度平衡的二叉树)

  MultiMap/MultiSet: key可重复的。

  Map是key-value,Set是key-key。

  无序容器:元素存放的位置是不固定的,由hash-table实现(目前最好的实现方式是seperate chaining)。

五、容器使用

  1、编码习惯

     (1)为每个独立的程序创建namesapce;

     (2)  在用到变量时才定义变量,但不缩进;

  2、vector

    (1)因为单向,只能通过push_back存放元素(从头存放需要移动整个vector);

    (2)   当空间不足,重新分配内存时,内存两倍增长;

    (3)可以通过front,back访问首尾元素,data访问首地址(vector, array, list);

  3、List

     标准库有sort,各个容器也有自带sort,排序尽量用自带的sort。每次扩充一个结点,空间利用率高

 4、forwad_list

      (1)压入元素用的是push_front(其他用的都是push_back);

    (2)只有front访问首元素(back,size都不提供);查找较慢。

   5、deque

   (1)内存分段连续(由buffer构成,每个buffer是连续的),当内存不够时,重新分配一个buffer。 

   (2)没有自带的sort,只能使用全局的sort

   

   6、stack、queue

    内部都是通过deque来实现,一个后进先出,一个先进先出(不提供iterator)。有人也称之为容器的适配器(Adapter)

      

  7、multiset/multimap

  (1)通过insert插入元素(会慢一点),有自带的find进行查找(很快)

  (2)multimap: c.insert(pair<int, string>(i, buf)),不能使用c[i]来进行插入(key可能重复)

  (3)查找时(*item).first为key,second为value

 8、unordered_multiset/unordered_multimap

      哈希表实现

 9、map

      可通过m[i]=c来插入,内部会形成pair<>(i, c)来进行插入 

 

七、在双向链表下,使用不同的分配器

 

  直接使用容器(有默认分配器),不要使用分配器分配内存;有小量内存分配需求时,可以使用new/malloc,不要直接使用分配器

八、总结

 

posted @ 2018-11-09 17:59  牧马人夏峥  阅读(287)  评论(0编辑  收藏  举报