您的位置:首页 > 其它

STL序列容器

2014-02-15 23:17 183 查看
序列容器:逻辑上有序,但是实际上其地址不一定是连续的.

序列容器包括vector,list,deque,queue,priority_queue,stack.
我们下面对每一个容器进行分析.

vector容器
大家对vector一定非常熟悉了.当内存不足时候,会对vector进行扩容,扩容的方式是先申请一个更大的空间,然后把原来的数据复制到新的空间上,释放原先的空间.



vector的思想就是这么简单.
但是这回造成什么呢?迭代器失效:在删除一个元素后,begin不会失效,删除元素的迭代器和end迭代器都会失效.

list容器:
一个双向循环链表.



这里可以清楚的看出,list是一个双向链表.他的查找效果比单向链表更好.这里要特别讲一下node节点,他是用于标记尾节点的指针.

deque容器



这个图看起来很乱,其实一点也不复杂.
map:用于管理存储区,每当内存不够的时候,就向前扩充一个空间,或者向后扩充,当map用完以后,会再次申请把一个大内存,复制map中的数据,然后销毁旧的map.数据存储区域并不动.
start,finish:这里面还有两个迭代器,是deque中的数据,他们分别指向deque首部和尾部.
deque中迭代器失效:收尾添加数据仅能是当前迭代器(自己定义的迭代器)失效,需要重新复制,deque是不应该向中间添加数据的,如果强制向中间部分添加数据会造成所有迭代器同时失效.deque是可以存储引用值的,因为数据存储区不会进行拷贝.

map,他并不是容器,他是pritority_queue的底层实现.和上面那个图中的那个map毫不相关.
pritority_queue底层实现是使用map,即一个用vector实现的完全二叉堆.



每当新插入一个数据就会在后面添加一个数据,然后保持堆的性质,返回优先级最高的数据.该类型默认是比较<,一般使用该数据都要重载一个<操作符.
他并没有实现迭代器,所以不存在迭代器失效问题.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: