您的位置:首页 > 其它

STL源码剖析-学习之路(四)容器

2018-03-30 15:39 239 查看
容器分为序列式容器和关联式容器两种.
vector:当我们以push_back()将新元素插入到vector尾部时,该函数首先检查是否还有备用空间,如果有就直接在备用空间上构造元素,并调整迭代器finish,使vector变大.如果没有备用空间了,就扩充空间(重新配置,移动数据,释放原空间).
注意:所谓动态增加大小,并不是在原空间之后接续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以某种策略另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放空间.因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了.
list:相较于vector的连续线性空间,list就显得复杂的许多,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间,因此,list对于空间的运用有绝对的精准,一点不浪费.而且,对于任何位置的元素插入或者元素移除,list永远是常数时间.
deque:vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间.所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操作.deque和vector的最大差异,一在于deque允许于常数时间内对起头段进行元素的插入或者删除操作,二在于deque没有所谓的容量(capacity)概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来.换句话说deque不会因为空间不足而像vector一样引起空间重分配并且移动元素.deque采用一块所谓的map(注意,不是STL的map容器)作为主控.这里所谓的map是一小块连续空间,其中每个元素(此处成为一个节点,node)都是指针,指向另一段(较大的)连续线性空间,成为缓冲区.缓冲区才是deque的存储空间主体.当map使用率已经满载,便需要再找一块更大的空间来作为map.
stack:以deque或者list作为底部容器实现.因为只有stack顶部的元素,才有机会被外界取用.stack不提供走访功能,也不提供迭代器.
queue:以deque或者list作为底部容器实现.因为只有queue顶部的元素,才有机会被外界取用.queue不提供走访功能,也不提供迭代器.
heap:heap不属于STL容器组件,而是作为算法提供make_heap,push_heap,pop_heap,sort_heap等接口.
priority_queue:以vector为底层容器.利用max_heap实现.不提供遍历,不提供迭代器.
set,map,multiset,multimap:底层机制均以红黑树实现.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: