(三)容器探索:顺序容器

一、list

       1、一个list包括一个node,本身是一个指针,所以一个list大小为四字节;

       2、一个node抱括前后两个指针,以及一个数据;

  3、iterator迭代器本身并不是指针,而是一个类(因为链表内部是分离的,需实现++等操作)(除了vector, array,其他的迭代器都是类),

并且类内实现了众多的操作符重载;

       4、迭代器实现了前加和后加,和int类似,前加返回指针,可以连续操作;后加返回值,不能连续操作。

 

二、迭代器的设计原则

  迭代器需实现算法所需的三种操作:

  category:迭代器的移动性,(++, --, +=i.....)

  difference_type: 两个iterator之间的距离的表现

  value_type: 元素类型(string等等)

  还有两种reference和pointer

  

三、vector

  1、内含3个指针:start, end, end_of_storage

  

  2、push_back内存不足时,会分配2倍的内存,并将插入元素的前、后内容都拷贝过去(同时还有原vector元素的析构),

因此为耗时的操作。

 

  3、内存是连续的,所以迭代器只需指针实现

四、array

  内部其实就是一个数组

  

五、deque

  1、分段连续,由多个buffer组成。buffer的顺序由map决定(vector,内部是指针);

  2、扩充时,另外分配buffer,前扩则放在map前,后扩放在map后,可实现双向扩充;

  3、迭代器包括4个元素,其中node指向控制中心(map),指向当前的buffer;first为当前buffer的首元素,last为末尾元素。当到达

边界时,node会加1,指向下一个buffer,从而实现连续空间的假象。

  4、插入时会进行判断:如果靠近前端,则会移动前端元素,空出位置,反之则反。

六、stack和queue

       1、底层容器默认为deque,但也可以选择list

           

 

       2、因为不允许遍历,所以没有迭代器;

  3、stack可以选择vector作为底层结构,queue不行:没有pop_front操作。都不可以选择map/set作为底层结构;

      

 

posted @ 2018-12-28 16:36  牧马人夏峥  阅读(116)  评论(0编辑  收藏  举报