(三)容器探索:顺序容器
一、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作为底层结构;